【发布时间】:2014-07-05 19:53:59
【问题描述】:
通常当递归调用函数时,堆栈中的返回地址指向函数调用之后的下一条指令。但是在斐波那契代码中,返回地址将指向哪里?即“+”运算符之后的下一行或剩余代码行?
int Fibonacci(int x) {
if (x == 0) return 0; // Stopping conditions
if (x == 1) return 1;
return Fibonacci(x - 1)/*cond1*/ + Fibonacci(x - 2);/*cond2*/
}
就我对递归的理解而言,执行 cond1 直到返回 0 或 1 值(即递归树最左侧分支上的深度优先),然后才会执行 cond2,依此类推。那正确吗?当控件执行 Fibonacci(x-1) 时,返回地址会在堆栈中保存为什么(即 EBP)?
Fibonacci(3)
/ \
/ \
/ \
/ \
/ \
Fibonacci(2) * Fibonacci(1)
/ \ \
/ \ \
/ \ \
/ \ \
Fibonacci(1) * Fibonacci(0) 1
| |
| |
| |
| |
1 0
【问题讨论】:
-
是的,你是对的。这种DFS的类型也称为Pre-order,即先访问根,然后遍历左子树,再遍历右子树。