【问题标题】:recursion in array to find odd numbers and push to new variable在数组中递归以查找奇数并推送到新变量
【发布时间】:2019-06-03 00:07:45
【问题描述】:

我尝试递归这些数组以找到奇数/偶数,然后将 push 它们到 newArr 但结果,而不是数组,该结果是带有数字的字符串,即找到奇数/偶数后的结果。

这是我写的代码,

function odd(nums){
  var result = [];
  if(nums.length === 0) {
    return result;
  } else  if (nums[0] % 2 === 0){
    result.push(nums[0])
    // return odd(nums.slice(1))
  };
  return result + odd(nums.slice(1));
};

var arr = [1,8,3,4,4,5,9,13,13,9,10];
var print = odd(arr);
console.log(print)
如果我不写return result + odd(nums.slice(1)); 结果什么都没有/undefined

谁能帮我解释一下为什么结果是一个字符串,而不是我想要的数组

【问题讨论】:

    标签: javascript arrays loops if-statement recursion


    【解决方案1】:

    您需要concat 数组。 + 仅适用于字符串或数字。

    顺便说一句,在块语句{ ... } 之后,您不需要分号。

    function odd(nums){
        var result = [];
        if (nums.length === 0) {
            return result;
        } 
        if (nums[0] % 2 === 0) {
            result.push(nums[0]);
        }
        return result.concat(odd(nums.slice(1)));
    }
    
    var arr = [1, 8, 3, 4, 4, 5, 9, 13, 13, 9, 10];
    var print = odd(arr);
    console.log(print);

    【讨论】:

    • 你用了 2 秒就更快了 :)。无论如何,+1。
    • 如果我们想检查数字是否是回文,如果数字不是回文,则数字将继续添加,直到我们发现数字是回文,`例如:num = 106,而不是回文, num+=1 现在是 num 107,不再是回文,然后再次相加直到 111 是回文`,然后数字结果是 111 ,我们可以在递归中这样做吗? ,我试过但结果递归太多@Nina
    • @ZumDummi,递归的结果应该是什么?获得更接近的回文或只是true/false
    • 结果必须是最后一个回文数,我知道如何找到返回值和真值,但我想知道如果我们将它与递归一起使用,我们是否可以反击这些数字:D ,这可能吗??
    • 是的,可以通过将数组或对象作为结果并调用函数直到它产生有效结果。
    【解决方案2】:

    递归在 JS 中可能是一个坏主意,除非没有更好的方法来解决问题,否则应该使用它。如果递归函数调用过多,速度会变慢并可能导致溢出。

    要得到你需要的结果,最好使用数组filter 方法。更清晰,更快捷。

    var arr = [1,8,3,4,4,5,9,13,13,9,10];
    var odd = arr.filter(n => !(n % 2))
    console.log(odd)

    至于最初的问题,我会这样做:

    function odd(nums, result = []){
      if (!nums.length) return result; // no need for else, this way clearer
      if (nums[0] % 2 === 0) result.push(nums[0])
      return odd(nums.slice(1), result)
    };
    
    var arr = [1,8,3,4,4,5,9,13,13,9,10];
    console.log(odd(arr))

    !!!注意,下一个 sn-p 将导致 StackOverflow !!!

    您可以将数组长度减少到 10000 以检查它是否可以正常工作。

    function odd(nums, result = []){
      if (!nums.length) return result; // no need for else, this way clearer
      if (nums[0] % 2 === 0) result.push(nums[0])
      return odd(nums.slice(1), result)
    };
    
    const arr = Array.from({length: 100000}, (_,i) => i)
    const result = odd(arr)
    console.log(`Array length: ${arr.length}`)
    console.log(`Result length: ${result.length}`)
    console.log(result.slice(0,5))

    【讨论】:

    • 我主要反对 JS 中的递归通常是一个坏主意的想法。如果使用得当,它会非常有用。
    • 我知道,我。只是想学习如何使用递归:D,谢谢信息:D
    • 我改写了关于递归的答案:) @Lewis,你能举个例子说明它什么时候非常有用吗?
    • 构建 Javascript 游戏引擎,过滤菜单的类别级别...
    • @ZumDummi 我更新了答案,在递归函数中你可能需要一些累加器变量。
    【解决方案3】:

    您可以使用concat 方法。

    function odd(nums){
      var result = [];
      if(nums.length === 0) {
        return result;
      } else  if (nums[0] % 2 === 0){
        result.push(nums[0])
        // return odd(nums.slice(1))
      }
      return result.concat(odd(nums.slice(1)));
    }
    
    var arr = [1,8,3,4,4,5,9,13,13,9,10];
    var print = odd(arr);
    console.log(print)

    【讨论】:

      【解决方案4】:

      另一种方法是将包含结果的数组作为参数传递,因为它将是一个引用,您不必返回任何内容。

      function odd(nums, result)
      {
          if(nums.length != 0)
          {
              if (nums[0] % 2 === 0)
              {
                  result.push(nums[0]);
              }
              odd(nums.slice(1), result);
          }
      }
      
      var arr = [1,8,3,4,4,5,9,13,13,9,10];
      var result = [];
      odd(arr, result);
      console.log(result)

      【讨论】:

      • 在我的学校,考试规则,我们不能在函数递归中添加其他参数:D @Cid
      【解决方案5】:

      您现在使用的不是concat,而是您现在使用的字符串连接+,最好使用filter

      var odd = [], 
         even = [1,8,3,4,4,5,9,13,13,9,10]
        .filter(function(x) { if (x % 2 === 0) return true; else odd.push(x) } );
      console.log(odd,even)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        • 2022-01-22
        • 1970-01-01
        • 2017-03-23
        • 2019-06-10
        • 2016-11-17
        相关资源
        最近更新 更多