【问题标题】:Recursion method递归方法
【发布时间】:2021-10-23 12:46:48
【问题描述】:

此方法无法正常工作。哪里出错了?

找出奇数:

array = [1,2,3,4,5,6,7,8,9,10]

function findOddNum(array) {
  let result = [];
  let i = 0;

  function helper_func(inputArray) {
    if (inputArray.length === 0) {
      return false;
    }
    if (inputArray[i] % 2 !== 0) {
      result = inputArray[i];
    }
    i++;
    helper_func(array);
  }
  helper_func(array);
  return result;
}
const res = findOddNum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);

console.log(res);

它返回以下错误:

maximum call stack size not exceeded

【问题讨论】:

  • 你有无限递归,因为你无条件地为非空inputArrays 调用helper_func 函数。你期望长度会以某种方式改变吗?你只是在改变i。为什么要使用递归来查找奇数?
  • Amaan,您应该使用English 语言来解释您的问题。大多数人不理解Hindi,如果他们不理解你的问题,那么他们肯定无法回答。

标签: javascript dsa


【解决方案1】:

在递归的情况下,您需要给出一个基本条件(终止条件),否则它将进入无限循环

在 helper_func 中添加以下行

if(i>=inputArray.length)
    return false;

function findOddNum(array) {
  let result = [];
  let i = 0;

  function helper_func(inputArray) {
    if (inputArray.length === 0) {
      return false;
    }
    if(i>=inputArray.length){
       return false;
    }
    if (inputArray[i] % 2 !== 0) {
      result = inputArray[i];
    }
    i++;
    helper_func(array);
  }
  helper_func(array);
  return result;
}
const res = findOddNum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);

console.log(res);

【讨论】:

    【解决方案2】:

    你还没有添加嵌套函数终止条件

    if (i >= inputArray.length) return;
    

    没有终止条件,它将无限递归。这就是它给你maximum call stack size not exceeded

    的原因

    function findOddNum(array) {
      let result = [];
      let i = 0;
    
      function helper_func(inputArray) {
        if (i >= inputArray.length) return; // change
        if (inputArray.length === 0) {
          return false;
        }
        if (inputArray[i] % 2 !== 0) {
          result.push(inputArray[i]);
        }
        i++;
        helper_func(array);
      }
      helper_func(array);
      return result;
    }
    const res = findOddNum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
    
    console.log(res);

    顺便说一句,您不必使用递归来获取奇数,这是一种线性解决方案

    array.filter((num) => num % 2)
    

    function findOddNum(array) {
      return array.filter((num) => num % 2);
    }
    const res = findOddNum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
    
    console.log(res);

    【讨论】:

    • 感谢我的学习者兄弟。所以我练习DSA
    • 没问题,我们都是像你一样的学习者。如果解决了您的问题,您介意accepting我的回答吗?
    • 当然是@decpk。希望您允许我向您提问
    • 确定为什么不这样做,但与其在评论部分提问,不如直接在 Stackoverflow(SOF) 中提问。在这里,可能只有一些人知道或知道某人何时发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多