使用递归

时间:2015-07-03 19:45:31

标签: javascript

为什么这不起作用?我的堆栈太深了错误:

var countRecursion = function(array) {
  var sum = 0
  var count = 0

  sum += array[count]
  count ++

  if (count < array.length) {
    countRecursion(array);
  } else {
    return sum
  }

}

4 个答案:

答案 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并检查第一个字词。您可以通过以下任一方式解决此问题:

  1. 在功能正文外部初始化count,当您执行count++时,它会增加并且不会重置为0.
  2. countarray一起作为参数传递。这样,当您第一次调用该函数时,您会说countRecursion(array, 0)为您初始化count
  3. 请注意,您必须对sum执行相同操作,否则也会始终恢复为零。

    最后,(并且这与堆栈错误没有关系)你必须实际调用return countRecursion(array)来实际向上移动堆栈(至少它是如何在C ++中运行的)什么不是 - 非常确定它也适用于javascript)。

答案 3 :(得分:-1)

使用递归方法的数组和

&#13;
&#13;
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;
&#13;
&#13;