2014-10-05 264 views
0
n = 10 
10+9+8+7+6+5+4+3+2+1 = 55 

這裏是一段代碼,將從n開始的數字添加到之前的每個數字。需要幫助瞭解遞歸

public static int recursion(int index){ 
    if (index == 0){ 
     return 0; 
    } 
    else{ 
     return recursion(index-1) + index; 
    } 
} 

抱歉愚蠢的問題,但在這裏就是讓我困惑:當指數不爲零,它調用遞歸函數再次,與1中減去,依此類推,直到該指數爲零的索引。但是,它是編碼遞歸(索引-1)+索引。

那麼爲什麼索引每次調用函數時都不會被1減去並且加上10(或任何索引號)?爲什麼它不是這樣的:(10+(9 + 10)+(8 + 10)+(7 + 10)+ ....)?

+0

'index'是'recursion'函數的局部變量,因此在當前遞歸(遞歸調用)開始時它總是有你傳入的值。這不是實際上有助於最終結果的「遞歸(索引-1)」;它是'+ index'部分(當你繼續調用函數時,它保持從10遞減到0)。最終歸結爲(((((((+ 1)+2)+3)+4)+5)+6)+7)+8)+9)+10)。 (我是否正確地計算括號?)) – 2014-10-05 16:34:42

回答

3

嘗試寫這個和作爲

sum(10) = 1+2+3+4+5+6+7+8+9+10 

這將讓你看到

sum(10) = (1+2+3+4+5+6+7+8+9)+10 = sum(9)+10 

sum(9) = (1+2+3+4+5+6+7+8)+9 

換句話說

sum(i) = sum(i-1) + i; 

或更精確

  {0   for i=0 
sum(i) = { 
     {sum(i-1) + i for i>0 

順便說一句每次方法被調用其變量是在每個方法調用,這意味着在indexrecursion(10)recursion(9)index單獨的變量單獨的實例。

+0

清除東西:)謝謝 – Rei 2014-10-06 05:11:32

2

手動評估它。開始index = 10

指數不爲零,所以我們進入else:現在

return recursion(10 - 1) + 10 

return recursion(9) + 10 

recursion(9)評估爲

return recursion(9 - 1) + 9 

return recursion(8) + 9 

因此,代入上面:

return recursion(8) + 9 + 10 

所以,進行過程

return recursion(0) + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 

我們知道,recursion(0)回報0所以遞歸停止在這一點上。

+0

這是非常明確的解釋。謝謝:D – Rei 2014-10-06 05:12:04

0
recursion(index-1) + index; 

對於這一說法intiallty這將是

recursion(10-1) + index; 

用於評價10-1會即完成。 9 然後爲了找到該語句的答案recursion(9)必須被找到,所以函數recursion被再次調用。 所以表達式變爲

recursion(9) + 10; 

和遞歸(9)時便會

recursion(9-1) + 9 

這繼續,最後這將是recursion(0)返回0