我试图解决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;我可以把它基本上只是重新运行函数,直到总和是一位数?
答案 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挑战。