2015-04-03 46 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挑战。