我不懂JavaScript中的递归
我不明白我不懂JavaScript中的递归,javascript,Javascript,我不明白 function rec(arg){ console.log(arg); if(arg == 3) return arg; else rec(arg + 1); } var i = rec(0); console.log(i); //0 //1 //2 //3 //undefined 为什么在函数“arg”中有一个值,但在返回它时('arg==3')它会给我“undefined” 这是另一个 function power(b
function rec(arg){
console.log(arg);
if(arg == 3)
return arg;
else
rec(arg + 1);
}
var i = rec(0);
console.log(i);
//0
//1
//2
//3
//undefined
为什么在函数“arg”中有一个值,但在返回它时('arg==3')它会给我“undefined”
这是另一个
function power(base, exponent) {
console.log(exponent);
if (exponent == 0)
return 1;
else
return base * power(base, exponent - 1);
}
console.log(power(2, 3));
//3
//2
//1
//0
//8
当函数中的“指数”为“0”且应返回“1”时,为什么它返回“8”
我现在明白了,我不明白JS是如何工作的。在您的第一个示例中,您应该写一行 如果(arg==3)返回arg;else rec(arg+1) 就这样 如果(arg==3)返回arg;else返回rec(arg+1) 在第二个示例中,您应该更改行 返回基数*幂(基数,指数-1) 到 返回Math.pow(基数、指数) (实际上,您只需调用pow()来替换整个函数,无需重新编写) 编辑: 在第一个示例中,您应该将it town分成多行,然后您会将其视为一个简单的错误。那么像这样,
if(arg == 3)
return arg;
else
return rec(arg + 1);
对于后代和良好习惯,应该是这样的(换句话说,使用括号)
在第二个示例中,您在不应该使用递归的时候使用了递归。只需简单地调用Math.pow()即可。除非您想记录行为,否则无需重新编写函数
编辑:
读了你的评论后,我犯了错误。我道歉
流程如下所示:
if(arg == 3)
return arg;
else
return rec(arg + 1);
控制台日志(电源(2,3))
然后去排队
if (3 == 0)
return 1;
else
return 2 * power(2, 3 - 1); //power() returns 4, we return 8
//same as: return 2 * power(2, 2);
if (2 == 0)
return 1;
else
return 2 * power(2, 2 - 1); //power() returns 2, we return 4
//same as: return 2 * power(2, 1);
if (1 == 0)
return 1;
else
return 2 * power(2, 1 - 1); //power() returns 1, we return 2
//same as: return 2 * power(2, 0);
if (0 == 0)
return 1;
else
// moot
然后去排队
if (3 == 0)
return 1;
else
return 2 * power(2, 3 - 1); //power() returns 4, we return 8
//same as: return 2 * power(2, 2);
if (2 == 0)
return 1;
else
return 2 * power(2, 2 - 1); //power() returns 2, we return 4
//same as: return 2 * power(2, 1);
if (1 == 0)
return 1;
else
return 2 * power(2, 1 - 1); //power() returns 1, we return 2
//same as: return 2 * power(2, 0);
if (0 == 0)
return 1;
else
// moot
然后去排队
if (3 == 0)
return 1;
else
return 2 * power(2, 3 - 1); //power() returns 4, we return 8
//same as: return 2 * power(2, 2);
if (2 == 0)
return 1;
else
return 2 * power(2, 2 - 1); //power() returns 2, we return 4
//same as: return 2 * power(2, 1);
if (1 == 0)
return 1;
else
return 2 * power(2, 1 - 1); //power() returns 1, we return 2
//same as: return 2 * power(2, 0);
if (0 == 0)
return 1;
else
// moot
然后去排队
if (3 == 0)
return 1;
else
return 2 * power(2, 3 - 1); //power() returns 4, we return 8
//same as: return 2 * power(2, 2);
if (2 == 0)
return 1;
else
return 2 * power(2, 2 - 1); //power() returns 2, we return 4
//same as: return 2 * power(2, 1);
if (1 == 0)
return 1;
else
return 2 * power(2, 1 - 1); //power() returns 1, we return 2
//same as: return 2 * power(2, 0);
if (0 == 0)
return 1;
else
// moot
因为你没有告诉我
function rec(arg){
console.log(arg);
if(arg == 3)return arg;
else rec(arg + 1); // < --- not a return statement
}
var i = rec(0);console.log(i);
虽然前面的答案给出了事实上正确的信息,但它们并没有解决您的误解 在这两种情况下,您都希望递归函数的返回是最后一次(最内层)调用的返回。那是不对的 从最里面的调用返回到第二个最里面的调用;然后继续,直到最后最外层的调用返回。调用者只能看到最外层调用的返回值 因此,在第一个示例中,调用
rec(0)
。
然后rec(0)
调用rec(1)
,
调用rec(2),
调用rec(3)
然后rec(3)
将值3
返回到rec(2)
(因为该值仍在运行)。
然后rec(2)
退出而不返回rec(1)
退出而不返回到rec(0)
退出而不返回调用方
因此,调用者将返回视为未定义
在第二种情况下,是的,power()
的最后一次调用是power(2,0)
,它返回1。。。运行调用power(2,1)
返回2到运行调用power(2,2)
。。。以此类推,直到调用方看到的最终返回值为8
顺便说一下,这不是“JavaScript中的递归”。这是递归。我想我是在“if(arg==3)RETURN arg;”行中告诉它的它只被告知第一次返回,大约在0。第二次、第三次和第四次调用将永远不会返回给发送方。仔细想想,您发送了一个值0,并说如果它等于3,则返回,但它不返回,并且后面没有更多的返回语句,因此没有任何内容可返回。下面的递归调用只会将值返回给前一次方法调用,但该值从未从原始方法调用中恢复。第二个是有效函数。我只是不知道它为什么工作。是的,我知道我不必重新编写pow。我正在给出一个我不理解的示例。幂(2,3)应该是:2*(2^(3-1))…这是2*(2^2)…也就是2*4…如果你有返回的幂(2,3),并将其定义为返回的幂(基数,指数),那么它就是8;你会没事的,谢谢你!好心的先生!