【问题标题】:Why is my basic recursion looping infinitely?为什么我的基本递归无限循环?
【发布时间】:2019-11-12 15:25:47
【问题描述】:
let data = [1, 2, 3]
let sorted = []

let push = function(i) {
  while(i<data.length) {
    sorted.push(data[i])
    push(i + 1)
  }
}

push(0)

大家好,

我正在编写一些基本的递归,但它似乎没有退出。很抱歉这个基本问题,但我希望有人能解释一下。

预期行为:模仿 for 循环 - 遍历数组并推送到新数组。当我们到达i == data.length时退出

实际行为:运行 0、1、2,然后运行 ​​2 直到堆栈溢出。

Codefiddle:https://jsfiddle.net/t579jbog/

【问题讨论】:

  • 您的while 循环永远不会改变i 的值
  • 你应该使用if而不是while

标签: javascript arrays function recursion iteration


【解决方案1】:

您应该使用if 而不是while,并确保在递归调用中使用不同的i 值。

let data = [1, 2, 3]
let sorted = []

let push = function(i) {
  if (i < data.length) {
    sorted.push(data[i]);
    push(i + 1);
  }
}

push(0);

console.log(sorted);

【讨论】:

  • i + 1++i 一样有效。不需要修改i,因为i不会在函数中再次使用。
  • 我的坏@Paulpro,我会补充的。
【解决方案2】:

您可以使用 shift() 代替索引(shift() 删除数组上的第一项并返回该值 - 可以将其推入已排序的数组中。

然后只需检查数组长度是否 >0,如果是 - 将其传递给同一个函数以重做该函数,直到数组为空。

我正在安慰已排序的数组以证明它每次都能获取值。

let data = [1, 2, 3]
let sorted = []

let push = function(arr) {
    sorted.push(arr.shift())
    console.log(sorted);
    
    if(arr.length > 0) {
      push(arr); 
    }
  }


push(data);

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多