使用递归添加持久性

时间:2015-04-03 02:09:23

标签: javascript recursion

我试图解决Coderbyte挑战,而我仍然试图完全理解递归。

问题在于:使用JavaScript语言,让AdditivePersistence(num)函数获取传递的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)); 

它告诉我递归太多了。还有其他&#34;否则&#34;我可以把它基本上只是重新运行函数,直到总和是一位数?

2 个答案:

答案 0 :(得分:0)

其中一个问题是您的 if 语句永远不会评估为'true'。原因是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

}

答案 1 :(得分:0)

修复“过多的递归问题”,

<? $form = ActiveForm::begin([
    'layout' => 'horizontal',
    'fieldConfig' => [
        'template' => "{input}\n{hint}\n{error}",
        'horizontalCssClasses' => [
            'error' => 'help-inline',
            'hint' => '',
        ],
    ],
    'errorCssClass' => 'error'
]);
?>

但是,正如其他人所说,您的实施不会返回Additive Persistence。使用James Farrell的答案解决Coderbyte挑战。