递归均匀性检查返回undefined

时间:2014-12-15 20:37:54

标签: javascript

an exercise in Eloquent JavaScript的措辞是:

  

递归

     

我们已经看到%(余数运算符)可用于测试是否   使用% 2检查它是否可被整除,数字是偶数还是奇数   二。这是另一种定义是否为正整数的方法   偶数或奇数:

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

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

     

在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));

当数字不是0或1时,else分支似乎工作正常;我认为问题在于if分支。

4 个答案:

答案 0 :(得分:10)

a < 0 ? isEven(-1 * a) : isEven( a-2);

此行缺少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);
}

但这种方式也有效:

function isEven(a) {
    return a % 2 === 0;
}

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

function isEven(a) {
    return (
        a === 0 ? true       :
        a === 1 ? false      :
        a < 0   ? isEven(-a) : isEven(a - 2));
}

因为在r = true运算符中设置?实际上并不起作用,如果这是重点。不过,我仍然使用运算符,因为它适用于±Infinity和NaN。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

你有没有使用简单的奇怪支票?

var isEven = function ( a ) {
    return (a % 2 === 0) ? true : false;
}

答案 3 :(得分:0)

感谢您的回答我得到了什么问题。

在递归的情况下,如果你想将基本案例的结果传递给等待响应的调用,那么使用result是必不可少的,无论如何都不会这样做。如果案例库的调用结束时没有任何结果,您期望发生什么?什么都没有归还等等。

我学到的另一件事是你不能将result与三元运算符一起使用。

所以,最后,一个解决方案可以是这个:

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

完美无缺。

如果有人想知道这本书提供的解决方案,那就是这个:

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);

}