Javascript Recursion?

Javascript Recursion?

本文关键字:Recursion Javascript      更新时间:2023-09-26

我正在练习递归。从概念上讲,我理解这应该如何工作(见下文),但我的代码不起作用。

请告诉我我做错了什么。请解释代码的每一步以及它是如何工作的。清晰的解释比只给我一个有效的代码要好十倍。

  /*
  buildList(0, 5) ==  buildList(0, 5 - 1) // [0]
  buildList(0, 4) ==  buildList(0, 4 - 1) // [0,0]
  buildList(0, 3) ==  buildList(0, 3 - 1) // [0,0,0]
  buildList(0, 2) ==  buildList(0, 2 - 1) // [0,0,0,0]
  buildList(0, 1) ==  buildList(0, 1 - 1) // [0,0,0,0,0]
  */
var buildList = function(value, length) {
    var result = [];
   if (length === 0) {
    return result;
   }
   result.push(value);
   return  buildList(result.push(value), length - 1);
};

buildList(0, 5);

我理解递归是如何在概念层面上工作的。

您的方法无法工作,因为基本情况返回一个新的空数组,而其他情况返回递归的结果。

相反,你应该先递归,然后推

var buildList = function(value, length) {
  if (length <= 0) return [];
  var recur = buildList(value, length-1);
  recur.push(value);
  return recur;
};

或者,在基本情况下,您可以避免创建新的阵列

var buildList = function(value, length, array=[]) {
  if (length <= 0) return array;
  array.push(value);
  return buildList(value, length-1, array);
};

问题是,每次调用函数时,result变量都会重新初始化为[]。如果您在函数外声明该变量,则代码有效:

var result = [];
var buildList = function(value, length) {
   if(length === 0){
    return result;
   }
   result.push(value);
   return  buildList(result.push(value), length - 1);
};

buildList(0, 5);
console.log(result);
  /*
  buildList(0, 5) ==  buildList(0, 5 - 1) // [0]
  buildList(0, 4) ==  buildList(0, 4 - 1) // [0,0]
  buildList(0, 3) ==  buildList(0, 3 - 1) // [0,0,0]
  buildList(0, 2) ==  buildList(0, 2 - 1) // [0,0,0,0]
  buildList(0, 1) ==  buildList(0, 1 - 1) // [0,0,0,0,0]
  */
var result = []; //(1)
var buildList = function(value, length) {
   if (length === 0) {
    return result;
   }
   result.push(value);
   return  buildList(value, length - 1);  //(2)
};

buildList(0, 5);

你做错了两件事:

  1. 您正在初始化方法内部的结果。这意味着每次进行递归方法调用时,都要将结果重置为一个空数组
  2. 您正在将数组传递到buildlist()的递归调用中。您希望在其中传递值