为什么这不起作用?我的堆栈太深了错误:
var countRecursion = function(array) {
var sum = 0
var count = 0
sum += array[count]
count ++
if (count < array.length) {
countRecursion(array);
} else {
return sum
}
}
答案 0 :(得分:2)
你犯了一个错误并在递归块内重置了sum和counter。我只是把它们搬到了外面。
var countRecursion = function(array) {
sum += array[count]
count ++
if (count < array.length) {
countRecursion(array);
} else {
return sum
}
}
var sum = 0
var count = 0
countRecursion([1,2,3]);
alert(sum);
此代码不是递归的,而是迭代的。如果那是你真正想要的,我不是百分百肯定的。但是既然你提到它,有些人投了我的答案,因为我只修复了你的代码,但我没想到它是递归的。为了完整性,这里是代码的递归版本:
var countRecursion = function(array, ind) {
if (ind < array.length) {
return array[ind] + countRecursion(array, ind + 1);
} else {
return 0;
}
}
var sum = 0
var count = 0
sum = sum + countRecursion([1,2,3, 5, 6, 7], count);
alert(sum);
答案 1 :(得分:0)
对于递归:传递数据,返回数据。
原始代码有一个不同的 count
变量,是函数中定义的局部变量,初始设置为0.这样的基础永远不会达到大小写,函数会在抛出异常之前进行递归。
除了使用外部作用域中的变量(或其他副作用)之外,还可以通过遵循有关如何处理递归的建议来解决此问题,例如。
var countRecursion = function(array, index) {
index = index || 0; // Default to 0 when not specified
if (index >= array.length) {
// Base case
return 0;
}
// Recurrence case - add the result to the sum of the current item.
// The recursive function is supplied the next index so it will eventually terminate.
return array[index] + countRecursion(array, index + 1);
}
答案 2 :(得分:-1)
我看到你在想什么。
您的代码存在的问题是,每次调用countRecursion
时,count
都会返回0(因为它在您的函数体中初始化为0)。这使得countRecursion
无限次执行,因为您总是回到count = 0
并检查第一个字词。您可以通过以下任一方式解决此问题:
count
,当您执行count++
时,它会增加并且不会重置为0. count
与array
一起作为参数传递。这样,当您第一次调用该函数时,您会说countRecursion(array, 0)
为您初始化count
。请注意,您必须对sum
执行相同操作,否则也会始终恢复为零。
最后,(并且这与堆栈错误没有关系)你必须实际调用return countRecursion(array)
来实际向上移动堆栈(至少它是如何在C ++中运行的)什么不是 - 非常确定它也适用于javascript)。
答案 3 :(得分:-1)
使用递归方法的数组和
var countRecursion = function(arr, current_index) {
if(arr.length === current_index) return 0;
current_index = current_index || 0;
return countRecursion(arr, current_index+1) + arr[current_index];
}
document.body.innerHTML = countRecursion([1,2,3,4,5, 6])
&#13;