所以我有以下功能:
var multiplyT = function(a, b, acc) {
if (b == 0) {
console.log("BASE CASE: ", acc);
return acc;
} else {
b--;
acc = acc + a;
console.log("NOT THE BASE CASE: ", a,b,acc);
multiplyT(a, b, acc);
}
}
它被称为:
console.log(multiplyT(5,3,0));
并给出:
NOT THE BASE CASE: 5 2 5
NOT THE BASE CASE: 5 1 10
NOT THE BASE CASE: 5 0 15
BASE CASE: 15
undefined
作为输出。我感到困惑的是,为什么acc会为console.log提供正确的值,但根据返回的内容却是“未定义的”。
这个不错。递归会使您的头旋转。它之所以未定义,是因为并非所有迭代都返回一个值,而对于那些没有返回的值,您将得到未定义的-就像将变量设置为不返回值的任何函数一样。
但是,它与递归混淆,因为在这种情况下,您看到的返回值来自首次调用和最后完成的迭代。与常规方法调用不同,在常规方法调用中return中断了该方法的执行-将其从返回的任何位置发送回去,递归仍然绕着调用栈返回,返回了它必须返回的所有值,包括未定义的值他们被称为的顺序。因此,它实际上为您的console.log调用提供了四个返回值:15,未定义,未定义,未定义。
因为它是同步的,所以console.log在调用它的方法完成之前无法执行。它输出的是它获得的最后一个值,或者未定义。如果在else块中的方法调用之后坚持返回,则将得到5,即函数第一次迭代后的acc值。
var multiplyT = function(a, b, acc) {
if (b == 0) {
console.log("BASE CASE: ", acc);
return acc;
} else {
b--;
acc = acc + a;
console.log("NOT THE BASE CASE: ", a,b,acc);
multiplyT(a, b, acc);
return acc;
}
}
console.log(multiplyT(5,3,0));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句