编写递归函数 - Eloquent JS

时间:2015-08-27 17:03:02

标签: javascript function recursion undefined

我试图编写一个函数来检查一个数字" N"通过减去2直到达到1或0是偶数或奇数。最终值0表示偶数。这里的目标是使用递归函数来达到最终结果,但我遇到了一些问题,我所返回的内容都是未定义的。

这是我到目前为止所做的。

function isEven(number) {
  function subTwo(number) {
    if (number == 0) {
      return true;
    }
    else if (number == 1) {
      return false;
    }
    else if (number > 0) {
      number -= 2;
      subTwo();
    }
    else {
      console.log("bruh");
    }
  };
};

console.log(isEven(50));
// → true
console.log(isEven(75));
// → false
console.log(isEven(-1));
// → ??

有人看到我做错了什么或对我有什么建议吗?

感谢。

修改

感谢帮助人员。有人建议我完全删除subTwo并使用isEven作为递归函数,并且我必须在第二个if / else语句中使用return isEven(number)

这两个建议共同帮助代码正确编译。

非常感谢大家,虽然我不确定为什么我会被贬低大声笑。

3 个答案:

答案 0 :(得分:1)

你的问题在这里:

subTwo();

您需要将当前版本的号码传递给它:subTwo(number);并将其返回。

您也可以通过省略内部函数中的参数来解决问题,如下所示:function subTwo(){...}内部函数已经可以访问父函数的参数(closure),所以你不需要把它传递到内部。

此外,这不会返回任何内容,它只是记录。 JavaScript总会返回一些东西。如果你不回复"某事",它会返回undefined

 else {
      console.log("bruh");
    }

就个人而言,我也会像你这样修改你的代码:

function subTwo(number) {
    if (number > 0) {
      number -= 2;
      subTwo();
    }
    else if (number == 1) {
      return false;
    }
    else if (number == 0) {
      return true;
    }
    else {
      console.log("bruh");
    }
  };

语句按降序排列,因此您可以快速查看进度。它可以帮助人们查看是否遗漏了任何内容。

答案 1 :(得分:0)

问题是你定义了函数subTwo但是在调用isEven时它实际上从未被调用过。更简单的版本是甚至没有其他功能,并且使用isEven

的递归调用完成所有操作
function isEven(number) {
  if (number === 0) {
    return true;
  } else if (number === 1) {
    return false;
  } else {
    return isEven(number - 2)
  }
}

修改

或者,如果您确实需要附加功能,请注意您已定义subTwo以接受参数,但在通过subTwo();递归调用时未传入参数。此外,当您递归调用subTwo(number)时,请确保您实际拥有return subTwo(number),以便在每次递归调用时返回该值。此外,您需要实际调用函数并在通过isEven(number)语句调用return并将函数包装在括号中并使用number调用它或使用{手动调用它时>返回结果{1}}。请参阅下面的示例,了解如何在每个阶段返回,以便将其全部传递回原始调用return subTwo(number)

isEven(number)

答案 2 :(得分:0)

正如在评论中所说,你永远不会检查小于0的值。当你输入值-1时会发生什么情况,它会跳转到代码的else部分。部分说“console.log(”bruh“);”完成该行后,程序继续运行并返回......没有。你没有返回任何东西,因此你为什么不定义。您应该设置代码来处理传递负数的情况。