我正在读一本JavaScript书籍,我对此很新,所以我得到了递归的部分,我得到了递归的工作原理,但这部分对我来说并不困难是数学部分。
这是代码:
function isEven(n) {
if (n == 0)
return true;
else if (n == 1)
return false;
else if (n < 0)
return isEven(-n);
else
return isEven(n - 2);
}
假设我将函数50作为右值传递给
isEven(50);
那给我真实......怎么来50 == 0是真的还是75 == 1是假的......我真的没有得到它。
答案 0 :(得分:2)
当您将50
传递给此函数时,它将转到最后一个块(else
)并以递归方式执行。当您编写return isEven(n - 2);
时,执行isEven(48)
,然后下次执行isEven(46)
,依此类推,直至达到isEven(0)
。
这会调用第一个if
块,您将获得true
作为输出。 true
返回isEven(0)
,然后是isEven(2)
(因为当你执行isEven(2)
时,你最终进入return isEven(0)
)这会使堆栈冒泡到最后将isEven(50)
的输出返回为true
。
答案 1 :(得分:2)
这段代码是检查数字是否均匀的一种方法。它依赖于这样一个事实:如果一个数是偶数并且你不断地从它中减去2,你最终会达到0.否则,如果你的数字是奇数,重复减去2将最终达到1.
因此,如果您传递的数字大于0,它将再次将下一个数字(n - 2)发送回函数,直到它达到0或1.然后我们停止。
如果数字是负数,我们只需翻转符号并执行相同的过程。
答案 2 :(得分:2)
这是一种将递归应用于可以简单解决的问题的有趣方法:
return n % 2 == 0
基本上,它有两个基本情况:n == 0
和n == 1
。这两个都是“已知的”,所以它们只返回真或假。如果数字为负数,请执行带有反转符号的递归调用(isEven(-n)
)。否则,你只需减去2(isEven(n - 2)
)。这是有效的,因为任何奇数减2仍然是奇数,偶数减2仍然是偶数。因此,您只需从n
中减去2,直到n
符合其中一个基本情况(n == 0
或n == 1
)。
if (n == 0) // base case
return true;
else if (n == 1) // base case
return false;
else if (n < 0) // reverse sign, call recursively
return isEven(-n);
else // default, subtracts 2, calls recursively
return isEven(n - 2);
答案 3 :(得分:0)
使用此tool可视化您的代码,您就会看到自己被挂断的地方。
点击页面加载后单击转发&gt; 按钮以逐步执行代码。
答案 4 :(得分:-1)
您可以使用%
运算符
let isEven = n => !(n % 2);