关于 普通递归 和 尾递归 的疑问
来源:7-19 尾递归的优化
AlphaYang223
2021-07-19
老师关于 普通递归 和 尾递归 的汇编代码我看得有点懵,我现在是这么理解的,不知道对不对?
//普通递归
Fib(4)
=>Fib(3) + Fib(2)
=>Fib(2) + Fib(1) + Fib(1) + Fib(0)
=>Fib(1) + Fib(0) + 1 + 1 + 0
=>1 + 0 + 1 + 1 + 0
=>3
普通递归不断的在开辟新的栈空间,而且要保存上一次得到的数据
//尾递归
Fib(4, 0, 1)
=>Fib(3, 1, 1)
=>Fib(2, 1, 2)
=>Fib(1, 2, 3)
=>3
尾递归没有其他的数据要去处理,就是在不断调用自身的函数。
而且
Fib(4, 0, 1)开辟一个新的栈空间后,之后的函数Fib(3, 1, 1),Fib(2, 1, 2)都在进行递归调用,但它们使用的是原先Fib(4, 0, 1)开辟出来的栈空间,直到最后Fib(1, 2, 3)才会再开辟一个新的栈空间,所以才说尾递归发生在最后。因为之前的递归调用不像普通递归,不断开辟新的栈空间。
以上就是我对6-18,6-19两节课的理解,有错误和不足的地方还希望老师帮我纠正补充下!
2回答
-
嘤嘤鸣
2021-11-03
尾递归因为是在函数的最后一句调用函数,也就是说是在函数的逻辑结束后才调用函数(逻辑上就好像一个函数被调用了多次。)这样的话编译器在编译的时候就可以把递归调用优化成循环的函数调用,而非尾递归的函数编译器是没法做这种优化的,因为在递归调用的地方,函数的逻辑还没有结束,不能优化成函数的循环调用。
10 -
quickzhao
2021-07-20
嗯,基本是对的。尾递归的本质是将递归方法中的需要的“所有状态”通过方法的参数传入下一次调用中。
10