所以我有以下功能:
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提供正确的值,但是" undefined"根据返回的内容。
答案 0 :(得分:10)
在你的else块中,它应该是return multiplyT(a, b, acc);
答案 1 :(得分:5)
你也需要从else块返回。
在您的情况下,即使acc
的值已更新,该值也会在b != 0
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);
return multiplyT(a, b, acc); //return here
}
}
console.log(multiplyT(5, 3, 0));
答案 2 :(得分:5)
这是一个很好的。递归可以使你的头旋转。它未定义的原因是因为并非所有迭代都返回一个值,而对于那些没有未定义的迭代 - 就像你将一个变量设置为任何不返回的函数一样值。
然而,它与递归相混淆,因为在这种情况下你看到的返回值来自第一次调用和最后完成的迭代。与常规方法调用不同的是,返回会中断方法的执行 - 将其从任何地方发送回来,递归仍然可以通过调用堆栈返回,返回它必须返回的任何值,包括undefined,反向他们被称为的顺序。所以它实际上给你的console.log调用了四个返回值:15,undefined,undefined,undefined。
因为它是同步的,所以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));
答案 3 :(得分:1)
您正在递归调用multiplyT函数,但您并未控制返回。然后,multiplyT(5,3,0)在第一次调用中不返回值,然后函数返回undefined。
堆栈正在执行,但第一次调用更重要:它需要从返回最终值的递归内部函数中获取值。
将代码修复在else分支中,以便您可以返回递归调用:
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);
return multiplyT(a, b, acc);
}
}
答案 4 :(得分:0)
我在处理我的一个项目时想出了一个很好的解决方案,我在其中遍历一个复杂的JSON对象,返回一些搜索id的数据。
var multiplyT = function(a, b, acc) {
if(b == 0) {
console.log("BASE CASE : ", acc);
return acc;
} else {
var ret;
b--; acc += a;
console.log("NOT THE BASE CASE: ",a,b,acc);
while( ret = multiplyT(a,b,acc) ) {
return ret;
}
}
}
这里,我们运行一个while循环来查看递归函数调用是返回true值还是undefined。如果返回undefined
以外的内容,则会返回数据。