递归均匀性检查返回undefined

Noo*_*r_1 -4 javascript

Eloquent JavaScript中一个练习,其措辞是:

递归

我们已经看到%(余数运算符)可以用来测试一个数是偶数还是奇数,% 2用来检查它是否可以被2整除.这是另一种定义正整数是偶数还是奇数的方法:

  • 零是均匀的.
  • 一个是奇怪的.
  • 对于任何其他数字N,其均匀度与N-2相同.

定义isEven与此描述相对应的递归函数.该函数应接受一个数字参数并返回一个布尔值.

在50和75上测试它.看看它在-1上的表现.为什么?你能想出解决这个问题的方法吗?

他们提供了一个解决方案,我已经编写了一个有效的实现,但另一个总是返回undefined; 为什么是这样?

var isEven = function ( a ) {
    var r = false;
    if ( a === 0 || a === 1 ) {
        a === 0 ? r = true : r ;
        return r;
    } else
        a < 0 ? isEven(-1 * a) : isEven(a - 2);
};

console.log(isEven(50));
Run Code Online (Sandbox Code Playgroud)

当数字不是0或1时,else分支似乎工作正常; 我认为,这个问题存在于if分支机构中.

Ry-*_*Ry- 10

a < 0 ? isEven(-1 * a) : isEven( a-2);
Run Code Online (Sandbox Code Playgroud)

这条线丢失了return.所以你可以这样写:

var isEven = function ( a ) {
    var r = false;
    if ( a === 0 || a === 1 ) {
        a === 0 ? r = true : r ;
        return r;
    }else 
        return a < 0 ? isEven(-1 * a) : isEven( a-2);
}
Run Code Online (Sandbox Code Playgroud)

但这种方式也有效:

function isEven(a) {
    return a % 2 === 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以扩展它以使用递归而不会使事情变得复杂,例如

function isEven(a) {
    return (
        a === 0 ? true       :
        a === 1 ? false      :
        a < 0   ? isEven(-a) : isEven(a - 2));
}
Run Code Online (Sandbox Code Playgroud)

因为设置r = true?运营商实际上不是功能性的,如果是这样的点.不过,我仍然会使用它,因为它适用于±Infinity和NaN.


Ism*_*awi 6

你需要return在else分支中有一个语句.因为它只是评估表达式并丢弃结果.