需要更好地理解这段代码

时间:2016-12-22 21:25:00

标签: javascript html css math recursion

我正在读一本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是假的......我真的没有得到它。

5 个答案:

答案 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 == 0n == 1。这两个都是“已知的”,所以它们只返回真或假。如果数字为负数,请执行带有反转符号的递归调用(isEven(-n))。否则,你只需减去2(isEven(n - 2))。这是有效的,因为任何奇数减2仍然是奇数,偶数减2仍然是偶数。因此,您只需从n中减去2,直到n符合其中一个基本情况(n == 0n == 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);