为什么这个递归的javascript函数返回它的作用

Why does this recursive javascript function return what it does?

本文关键字:返回 作用 函数 javascript 递归 为什么      更新时间:2023-09-26
var fn = function even (n) {
  if (n === 0) {
     return true
  }
   else return !even(n - 1)
 }
 fn(5)//=> false
 fn(2)  //=> true

为什么这个函数以它的方式工作? 当我在参数为 5 时逐步执行它时,它似乎调用自己直到 n 为零,这将返回 true,但它返回 false。

每个递归步骤都会为上一个结果添加一个否定:

f(0) = true
f(1) = !f(0) = !true = false
f(2) = !f(1) = !!f(0) = !!true = !false = true

依此类推,对于 f(5),你得到

f(5)
    !f(4)
        !!f(3)
            !!!f(2)
                !!!!f(1)
                    !!!!!f(0)
                    !!!!(!true)
                !!!(!false)
            !!(!true)
        !(!false)
    !true
false

这是因为

当函数为 0 时,它返回 true。

当它是 1 时,它将返回 !even(0) -> false。

当它是 2 时,它将返回 !even(1) => !(!偶数(0)) => !(假)=>真。

由于布尔值要么为真,要么为假,这意味着两个可能的值,并且您一次又一次地切换它们,因此它有效。