2017-04-18 30 views
0

我寫了一個java遞歸函數來得到一個數字的總和,如下所示,總和也應該是單位數。我在這裏面臨的問題是應該返回else部分在結尾因爲它是給之後如果其他條件return語句:響應不同值的遞歸函數

static int recSum(int n){ 
    int sum = 0; 
    while(n!=0){ 
     sum += n%10; 
     n = n/10; 
    } 

    if(sum>9) { 
     recSum(sum); 
    } 
    else { 
     return sum; 
    } 
     return sum ; 

}

讓我們假設N = 12345所以它需要返回5月底在那裏,因爲它是返回14.但是它會到其他部分,但正確的值不返回。我用三元運算符得到了解決方案,而沒有其他循環。但想什麼是我收到的14以前和這樣做的原因,而5(5來自14 = 1 + 4)

欣賞這個

+0

我不知道爲什麼在某些控制路徑上放棄recSum的返回值。另請注意,Java函數參數是按值傳遞的。清楚地寫下問題imho。我不明白downvote。 – Bathsheba

+0

@ Umadhar,遞歸方法中的'while'循環正在使其迭代運行,並消除了遞歸的目的。檢查我更正的答案。謝謝。 –

+0

在'if'中,你計算'recSum(sum)',但從不對結果做任何事情。你的意思是把它的值賦給'sum'?請記住,Java是_never_傳遞引用,所以如果你調用'recSum(sum)',那麼recSum調用中的'n'是'sum'的一個拷貝 - 並且不會像調用者那樣修改它被關注到。 – yshavit

回答

1

迴應,你應該做的改變是相當簡單:你應該刪除最後一個return聲明,就回到遞歸調用的結果:

static int recSum(int n){ 
    int sum = 0; 
    while(n!=0){ 
     sum += n%10; 
     n = n/10; 
    } 

    if(sum>9) { 
     return recSum(sum); 
    } 
    else { 
     return sum; 
    } 
} 
+0

如果我沒有return語句,編譯錯誤。 – UM1979

+0

@UmadharM看看我發佈的代碼。 'if'和'else'都有'return'語句。 –

+0

@UmadharM它應該編譯得很好,如果沒有,也許你的編譯器已經過時了。 只要你有返回recSum(sum),你總是可以保留最後的return語句; – Mart10

0

當此功能得到if語句和調用函數再次15被保存在堆棧上,直到當前呼叫完成後,當前的通話結束時,以前的回答是15,所以它返回,因爲你不修改無論如何它在返回之後。

+0

我明白你在說什麼,但是一旦遞歸調用完成,它會在內部修改總和,請你詳細說明一下嗎? – UM1979

0

這是一個迭代的方式(而不是在你的程序建立遞歸的好辦法)

while (n != 0) { 
     sum += n % 10; 
     n = n/10; 
    } 

這是正確的遞歸的方式,甚至爲0和負數的作品。

static int recSum(int n) { 
    int sum = 0; 

    sum = sum + (n % 10); 
    n = n/10; 

    if (n != 0) { 
     return sum + recSum(n); 
    } else { 
     return sum; 
    } 
}