【问题标题】:Why does this function return true?为什么这个函数返回true?
【发布时间】:2018-01-28 13:10:14
【问题描述】:
const res = (n => {
  const even = x => {
    if (x === 0)
      return true
    else {
      const odd = y => !even(y)
      return odd(x - 1)
    }
  }
  return even(n)
})(42)

console.log(res) //=> true

由于参数中使用了 42,但它表示仅当 x 为 0 且严格等于其类型和值时才返回 true,我不确定为什么返回 true。我认为任何值,但 0 应该返回 false。有人可以向我解释一下吗,我对 javascript 和编程非常陌生。

【问题讨论】:

  • 函数循环减1,直到减到0,然后返回true。在这里你可以看到它在工作:repl.it/KRZa
  • @Baruch 43 会发生什么? repl.it/KRZa
  • 应该指出,这是一种检查数字是否为偶数的荒谬不切实际且效率低下的方法。如果您打算真正使用它,请不要编写此代码。

标签: javascript function recursion lambda functional-programming


【解决方案1】:

如果你用局部函数和 IIFE 去除所有不必要的部分,那么你得到的只是一个零测试,那么它是一个偶数或一个非偶数的递归调用,并且值减一。

const even = x => x === 0 || !even(x - 1);

console.log(even(42)) // true
console.log(even(43)) // false

会发生什么是even的递归调用

 n  result of calling  simplified
--  -----------------  ----------
 8  !even(7)           !even(7)
 7  !!even(6)          even(6)
 6  !!!even(5)         !even(5)
 5  !!!!even(4)        even(4)
 4  !!!!!even(3)       !even(3)
 3  !!!!!!even(2)      even(2)
 2  !!!!!!!even(1)     !even(1)
 1  !!!!!!!!even(0)    even(0)
 0  !!!!!!!!true       true

【讨论】:

  • even = (num) => !(num % 2);
  • @keja,没错,但原来的功能是把参数倒计时到零,然后停止迭代。
【解决方案2】:

让我们简化一下。

第一步

const f = n => {
    const even = x => {
        if (x == 0)
            return true
        else {
            const odd = y => !even(y)
            return odd(x - 1)
        }
    }

    return even(n)
}

第 2 步

const f = n => {
    const even = x => {
        if (x == 0) return true
        return !even(x - 1)
    }

    return even(n)
}

第 3 步

const f = n => {
    let modificator = true

    while (true) {
      if (n == 0) return modificator
      modificator = !modificator
      n = n - 1
    }
}

第四步

const f = n => !(n % 2)

【讨论】:

    【解决方案3】:

    代码通过使用递归进行偶数/奇数次求反来工作。甚至多次否定true 会给出true。奇数否定true 给出false。忘记42 检查12

    如果你打开控制台,你也可以看到堆栈跟踪。

    return even(2) =>
    even(2) => odd(2 - 1)
    odd(1) => return !even(1)
    !even(1) => ! (odd(1-1))
    ! (odd(0)) => ! ( !(even(0))) => even(0)
    even(0) => true
    

    return even(1) =>
    even(1) => odd(1 - 1)
    odd(0) => !even(0)
    !even(0) => !(true) => false
    

    x 为 0,严格等于它的类型和值,我不知道为什么 返回true

    这发生在递归的尾部,这个truetruefalse 之间来回切换,因为每个递归调用都使用!even(y) 的否定来完成

    const res = ((n) => {
        const even = (x) => {
            if (x === 0) {
                console.log(x);
                console.trace();
                return true;
            }
            else {
                const odd = (y) => !even(y);
                console.log(x);
                console.trace();
                return odd(x - 1);
            }
        }
        return even(n)
    })(2) //=> true
    
    console.log(res);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2019-06-29
      相关资源
      最近更新 更多