尾递归的一种写法:
def fun1(n):
return fun2(n, 1)
def fun2(num, result):
if num == 1:
return result
return fun2(num - 1, num * result)
对于这种写法的一种浅显的理解:
第一个自定义函数只负责给第二个自定义函数传参。
第二个自定义函数才负责进行计算。且计算过程全部在函数中完成,return时只进行调用函数。因此不需要堆栈等待上一个函数的运行结果。
首先 要明白尾递归的定义。
简单来说,一个函数最后一句代码是调用函数,且仅调用函数。(不能有加减乘除等运算)
那么这个操作就被称为尾调用。
当这个调用为调用自己这个函数时,就被称为尾递归。
(存疑?递归的概念有点模糊,不知道这样说对不对)
Q:为什么没有对尾递归优化的语言也会爆栈?
(猜想)对尾递归有优化的函数可以自动释放上一条递归函数的空间。(因为上一条递归函数存在与否对结果不会产生影响)但是没有对尾递归进行优化的语言,则还会继续堆栈。