Open zlx362211854 opened 5 years ago
输出顺序为:3,2,1,0,0,1,2,3
鉴于递归函数的这一特性,我们在递归时,需要考虑尾递归优化。 什么是尾递归优化?
若一个函数在尾位置调用本身(或是一个尾调用本身的其他函数等),则称这种情况为尾递归,是递归的一种特殊情形。而形式上只要是最后一个return语句返回的是一个完整函数,它就是尾递归。 举个例子,实现一个阶乘函数:
常规实现:
function loop(num) {
if (num === 1) return 1;
return num * loop(num - 1) // 函数尾部是一个js表达式,不是纯的函数调用
}
loop(4)
尾递归优化:
function loop(prev, result) {
if (!result) result = 1;
if (prev === 1) {
return result
}
return loop(prev - 1, prev * result) // 函数尾部只有递归函数的调用,而不是表达式,这样栈内不会新增内容
}
loop(3)
输出顺序:3,2,1,0,0,1,2,3
递归函数不停地调动自身并押入栈中执行,如下动图:
function foo(i) { if (i < 0) return; console.log(i); foo(i - 1); console.log(i); } foo(3);