之前只知道递归这个概念,无非是函数内部调用自己。
递归递归,有来有回。从调用的最外层开始一层一层往里进去直到最里层然后带着结果一层层出来到最外面返回。
那么 尾递归是什么呢?
很多篇文章拿阶乘来举例子。
我按照我的理解总结为
- 最后的返回值只有函数自身的调用,而不含有表达式。
- 函数递归调用过程中产生的中间累计的值以变量的形式存储在下一层函数的入参中,逐级传递下去。
第二句话是我独创的。
接下来我们用代码来看看递归和尾递归的区别
# 递归 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
递归中间计算的值完全作为入参传递下去了,如果语言有对尾递归优化的话 ,这样的写法比较好的。
文章来源: 【基础】递归和尾递归,我的个人看法