我不懂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;你会没事的,谢谢你!好心的先生!