[英]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.