簡體   English   中英

我不懂JavaScript中的遞歸

[英]I don`t understand recursion in 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')它給我'未定義'?

這是另一個

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

當函數內的'exponent'為'0'時它為什么會返回'8',它應該返回'1'!

我現在明白我不懂JS的工作方式。

在第一個例子中,你應該寫一行

if(arg == 3)return arg; else rec(arg + 1);

就這樣

if(arg == 3)return arg; else return rec(arg + 1);

在第二個示例中,您應該更改該行

return base * power(base,exponent - 1);

返回Math.pow(base,exponent);

(實際上,你應該只需要調用pow()替換整個函數,你不需要重新編寫它)

編輯:在第一個例子中,你應該將它打破成多行,然后你會把它看作一個簡單的錯誤。 所以,像這樣:

if(arg == 3)
  return arg;
else 
  return rec(arg + 1);

對於后代和良好的習慣,它應該是這樣的(換句話說,使用括號)

if(arg == 3) {
  return arg;
}
else {
  return rec(arg + 1);
}

在您的第二個示例中,您在不應該使用時使用遞歸。 只需要一個簡單的Math.pow()調用即可。 除非您想記錄該行為,否則無需重新編寫該函數。

編輯:

讀完評論后我的錯誤。 我道歉。

流程如下:

console.log(power(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  

因為你沒有告訴它。

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);

else塊不是return語句。

至於你的第二個問題,那是因為0來自對該函數的嵌套調用:

base * power(base, exponent - 1);  // power(base, exponent - 1) would return 1 here, and base is probably 8 at that moment, so 8 * 1 would return you 8

雖然之前的答案給出了事實上正確的信息,但它們並沒有解決您誤解的問題。

在這兩種情況下,您都期望遞歸函數的返回是最后(最內部)調用的返回。 那是不對的。

從最里面的調用返回給第二個到最里面的調用; 然后這一直持續到最后最外面的調用返回。 調用者只能看到最外面的調用的返回值。

所以在第一個例子中,你調用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)調用power(2,1) ,它返回2運行的power(2,2)調用power(2,2)

......依此類推,直到來電者看到的最終回報為8。

順便說一下,這不是“JavaScript中的遞歸”。 這是遞歸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM