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

时间:2016-03-11 13:22:56

标签: javascript recursion

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。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

这是因为

当函数为0时,返回true。

当它为1时它将返回!偶数(0) - >假的。

当它为2时它将返回!even(1)=> !(!even(0))=> !(假)=>真。

由于布尔值为true,表示两个可能的值,并且您可以反复切换它们。