我不了解这种递归情况

时间:2019-12-25 15:58:01

标签: javascript recursion

这是FreeCodeCamp上此exercice的解决方案

function countdown(n) {
  if (n < 1) {
    return [];
  } else {
    const arr = countdown(n - 1);
    arr.unshift(n);
    return arr;
  }
}

我了解递归的概念。我知道函数倒数将一直重复到n <1,并且一旦对n的所有可能值都进行求值,将执行以下命令arr.unshift(n)。让我感到烦恼的是,我不知道const arr何时以及如何成为数组。

2 个答案:

答案 0 :(得分:0)

  

让我感到烦恼的是,我什么时候不知道const arr的时间或方式,   数组。

看基本情况是否返回一个空数组?这就是一切的开始,这要归功于一旦代码从递归调用中返回,您就可以继续处理数组结构。

代码说明

Unshift会将LIFO附加在第零个索引上,

最后一个是1,它将被添加到数组中,之后数组将在第0个索引处添加数字2,在第二个索引处您将添加数字1,在第3个数字将添加在第0个位置索引,第二个索引将是数字2,最后一个索引将包含数字1。现在您将看到模式...

尝试在两者之间进行console.log登录

function countDown(n) {
  if (n < 1) {
    return [];
  } else {
    const countArray = countDown(n - 1);
    console.log(n)
    countArray.unshift(n);
    return countArray;
  }
}
console.log(countDown(5));

如果您更习惯于ES6 +语法,请在数组的第一个位置添加第一个元素n,然后对其余元素进行解构。

function countDown(n) {
  if (n < 1) {
    return [];
  } else {
    const countArray=[n,...countDown(n - 1)];
    return countArray;
  }
}
console.log(countDown(5));

最后,您可以将其与三元运算符一起使用:

const countDown = (n) => n < 1 ? [] : [n, ...countDown(n - 1)];
console.log(countDown(5));

答案 1 :(得分:0)

让我们遵循一个相对简单的呼叫模式。这又是函数:

function countdown(n) {
  if (n < 1) {
    return [];
  } else {
    const arr = countdown(n - 1);
    arr.unshift(n);
    return arr;
  }
}

假设您致电countdown(2)

循环1:

1a)n不小于1

1b)初始化arr并将其设置为countdown(1)

循环2:

2a)n不小于1

2b)初始化arr并将其设置为countdown(0)

循环3:

3a)n小于1

3b)一个空数组返回到循环2

  

arr是[]

循环2继续

2c)arr.unshift将数字2添加到数组的开头。

  

arr是[2]

2d)arr返回到循环1

循环1继续

1c)arr.unshift将数字1加到数组的开头。

  

数组为[1,2]

1d)arr返回到函数调用

因此,如果您写了let result = countdown(2)console.log(result),则会得到:[1,2]

  

让我感到烦恼的是,我什么时候不知道const arr的时间或方式,   数组。

查看步骤3b,2b和2c:

3b) an empty array is returned to loop 2

2b) an arr is initialized and set to countdown(0)

2c) arr.unshift adds the number 2 to the start of the array.

将一个空数组设置为const arr,然后将数字2添加到该数组。

现在看步骤2d和1c:

2d) arr is returned to loop 1

1c) arr.unshift adds the number 1 to the start of the array.

该数组设置为像这样的{strong> new 数组(const arr = [2]),并将数字1添加到该数组。最终在1d中,该新数组返回到调用该函数的表达式中。对于每个递归循环,您都有类似以下内容:

const arr = something

new const arr = old const arr