【发布时间】:2021-10-19 18:18:27
【问题描述】:
我尝试编写此函数来猜测给定数字是否为偶数,使用递归, 这是我的代码:
function isEven(N){
if(N===0){
return true;
}else if(N===1){
return false;
}else {
isEven(N-2);
}
}
console.log(isEven(1)); // gives false
console.log(isEven(0)); //gives true
console.log(isEven(10)); // gives undefined
我不知道为什么这个函数除了0和1都不起作用。
【问题讨论】:
-
您在
isEven(N-2)之前忘记了return声明 -
欢迎来到 SO!为什么不
n % 2 === 0?我知道递归被误用于教学目的,但这超出了我的理解。除了给出的解决方案(在所有情况下都使用return),这将在负数上破坏堆栈。 -
@ggorlen:它也会以相对较小的正数破坏堆栈,但正如您所指出的,重点是完全教学法。从这里开始,我们可以做一些简单的改变来演示一个相互递归的解决方案(
const isOdd = (n) => n < 1 ? false : isEven (n -1)等)。演示相互递归的威力并不总是那么容易,但是这个通常是立即清晰的。 -
@ScottSauyet 好点,是的,这对正数也几乎没有用。我可能已经使用了 2-3 次相互递归。完全教学示例的问题在于,整个课程“完全是教学”,学生最终不知道将哪个工具应用于哪个问题,这几乎是成为一名成功程序员的 95%。不是对你咆哮,我相信你知道,但 recursion 标签上满是倒霉的学生,他们试图用螺丝刀砸钉子,因为他们必须......
-
@ggorlen:我们的经历完全不同。我发现自己在日常的 JS 编码中经常使用递归。它通常是解决方案的最简单、最易理解的版本;如果它对我的任务表现不佳,我会稍后重构。虽然相互递归不太常见,但它远非罕见。我同意程序员的教育应该旨在展示学生需要的工具和技术,但如果他们帮助展示这些技术,我对这样的作业没有任何问题。不,我没有感觉到针对我的咆哮,我希望你也不会。只是不同的体验。
标签: javascript recursion