var printRangeUpDown = function(min, max) {
if (min === max) {
console.log('condition met ' + min);
return
}
console.log('low to high ' + min);
printRangeUpDown(min + 1, max);
console.log('high to low ' + min);
};
printRangeUpDown(4, 10);
日志 4,5,6,7,8,9,10,9,8,7,6,5,4
有人可以解释为什么 printRangeUpDown 下面的 console.log 让它开始向后记录吗?我知道低将控制台日志 4,5,6,7,8,9,10(base case) ...但我不明白为什么递归下面的控制台日志会打印 9,8,7,6,5 ,4 回到最小
答案 0 :(得分:2)
想象一下您的递归调用堆栈(调用堆栈)。子函数必须完成,父函数才能继续。
因此,在达到基本情况时(即 min == max),每个递归调用的前半部分都已执行,并且每个递归调用都在等待其子项返回。
基本情况不会递归它只是返回。现在执行每个函数的后半部分。从最近被调用的 (min = 9
) 开始,然后朝着第一个被调用 (min = 4
) 的方向努力。这称为 LIFO 或后进先出。
打印值的原因是,对于每个函数调用,输入参数都被保留,直到它返回,所以你看到的是在返回到第一个时打印在通往基本情况的路上打印的相同值函数的调用。
如果我们为每个递归调用添加一个空格,那么查看第一个和最后一个、第二个和倒数第二个等调用如何匹配它们的值就变得简单了。
4, // first invocation
5, // second
6, // third
7, // fourth
8, // fifth
9, // sixth
10, (base case)
9, // sixth
8, // fifth
7, // fourth
6, // third
5, // second
4 // first invocation
答案 1 :(得分:0)
因为它是一个堆栈(先进后出)。
printRangeUpDown(4, 10)
时,它会转到 printRangeUpDown(min + 1, max);
,程序会等待这个函数返回继续前进。printRangeUpDown(5, 10)
,同上,等待printRangeUpDown(6, 10);
。printRangeUpDown(10, 10)
,最后是第一次返回。printRangeUpDown(9, 10)
将返回,因为 (10, 10)
已返回。printRangeUpDown(8, 10)
将返回,因为 (9, 10)
已返回。printRangeUpDown(4, 10)
回来了。