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会让它开始向后记录?我知道low将控制台日志4,5,6,7,8,9,10(基本情况) ...但我不明白为什么控制台日志记录下面的递归使它打印9,8,7,6,5,4回分钟
发布于 2020-12-30 12:13:05
想象一下你的递归调用堆栈(调用堆栈)。子函数必须完成,父函数才能继续。
因此,在达到基本情况(即最小==最大值)时,每个递归调用的前半部分都已执行,并且每个递归调用都等待其子调用返回。
基本情况不会递归,它只是返回。现在执行每个函数的后半部分。从最近调用的(min = 9)开始,到第一个被调用的(min = 4)。这称为后进先出或后进先出。
打印这些值的原因是,对于每个函数调用,输入参数都会被保留,直到它返回,所以您看到的是在返回到函数的第一次调用时,在执行基本情况时打印的相同值。
如果我们为每个递归调用添加一个空格,那么就很容易看到第一个和最后一个、第二个和倒数第二个调用如何匹配它们的值。
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发布于 2020-12-30 12:03:43
因为它是一个堆栈(先进先出)。
当您从一开始调用printRangeUpDown(4, 10)时,它将转到printRangeUpDown(min + 1, max);,程序将等待此函数返回go并转到printRangeUpDown(5, 10),如上所述,等待printRangeUpDown(6, 10);.
printRangeUpDown(10, 10),最后,第一个返回。由于<代码>D14是returned.
printRangeUpDown(9, 10)将返回,因为<代码>D18是D21返回。<代码>H222<代码>G223https://stackoverflow.com/questions/65501644
复制相似问题