【基础】递归和尾递归,我的个人看法

匿名 (未验证) 提交于 2019-12-03 00:22:01

之前只知道递归这个概念,无非是函数内部调用自己。

递归递归,有来有回。从调用的最外层开始一层一层往里进去直到最里层然后带着结果一层层出来到最外面返回。


那么 尾递归是什么呢?

很多篇文章拿阶乘来举例子。

我按照我的理解总结为

  1. 最后的返回值只有函数自身的调用,而不含有表达式。
  2. 函数递归调用过程中产生的中间累计的值以变量的形式存储在下一层函数的入参中,逐级传递下去

第二句话是我独创的。

接下来我们用代码来看看递归和尾递归的区别

# 递归 def func(n):     if n == 1:         return 1     else:         return n * func(n - 1) 

我们来看看这样的函数的计算过程

=> func(5)
=> 5 * fact(4)
=> 5 * (4 * fact(3))
=> 5 * (4 * (3 * fact(2)))
=> 5 * (4 * (3 * (2 * fact(1))))
=> 5 * (4 * (3 * (2 * 1)))
=> 5 * (4 * (3 * 2))
=> 5 * (4 * 6)
=> 5 * 24
=> 120


我们再看看尾递归的代码和流程

def func(n, src):     if n == 1:         return src     return func(n - 1, n * src)

=> func(5, 1)
=> func(4, 5)
=> func(3, 20)
=> func(2, 60)
=> func(1, 120)
=> 120

递归中间计算的值完全作为入参传递下去了,如果语言有对尾递归优化的话 ,这样的写法比较好的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!