2015-04-03 42 views
-1

我試圖解決Coderbyte挑戰,我仍然試圖完全理解遞歸。使用遞歸添加持久性

下面是問題:使用JavaScript語言,使用AdditivePersistence(num)函數獲取傳遞的num參數,它始終是一個正整數並返回它的附加持久性,這是您必須添加數字的次數直到你達到一個數字。例如:如果num是2718,那麼你的程序應該返回2,因爲2 + 7 + 1 + 8 = 18和1 + 8 = 9,並且你停在9上。

這裏是我放入jsfiddle.net來嘗試的解決方案出:

function AdditivePersistence(num) { 
    var count=0; 
    var sum=0; 
    var x = num.toString().split(''); 
    for(var i=0; i<x.length; i++) { 
     sum += parseInt(x[i]); 
    } 
    if(sum.length == 1) { 
     return sum; 
    } 
    else { 
     return AdditivePersistence(sum); 
    } 
} 
alert(AdditivePersistence(19)); 

它告訴我,有太多的遞歸。是否還有另一個「其他」我可以把基本上只是重新運行的功能,直到總和是一位數?

+1

您的函數不返回附加的持久性。它返回所有求和結束時得到的一位數字。你永遠不會增加計數器,這是你應該計算的。 – Barmar 2015-04-03 02:20:05

+0

嘗試使用調試器逐步執行代碼。 – 2015-11-01 12:41:56

回答

0

其中一個問題是,你的如果聲明永遠不會評估爲'真'。原因是sum變量保存了一個數字,並且數字沒有長度函數。另外,正如'Barmar'指出的那樣,您沒有增加count變量,也沒有返回count變量。

這是一個使用遞歸的解決方案。

function AdditivePersistence(num) { 

var result = recursive(String(num).split('').reduce(function(x,y){return parseInt(x) + parseInt(y)}), 1); 

    function recursive(n, count){ 
     c = count; 
     if(n < 10)return c; 
     else{ 
      count += 1 
      return recursive(String(n).split('').reduce(function(x,y){return parseInt(x) + parseInt(y)}), count) 
} 
} 

return num < 10 ? 0 : result 

} 
+0

這是正確的,但是,如果num <10,則不需要調用遞歸函數。我會讓'result'存儲函數,並在else子句中調用它:return num <10? 0:result(String(num)....); – marshy101 2015-11-01 12:19:44

0

要修復太多的遞歸問題「,

if(sum.toString().length == 1) 

然而,正如其他人所說,您的實現不返回Additive Persistence。使用James Farrell的答案來解決Coderbyte挑戰。