2016-03-11 4 views
0
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.Почему эта рекурсивная функция javascript возвращает то, что она делает?

+0

Попробуйте записать его, что он делает шаг за шагом –

+0

Это потому, что каждый рекурсивный вызов обращает значение булева, поэтому, если он кратен 2, он вернет true. Любая другая ваза будет ложной – Matriac

+0

При каждом рекурсивном вызове возвращаемое значение будет сбрасываться. Тогда '!!!!! false' является' true'. Короче говоря: ** Результат отрицается, когда '!' Применяется нечетные времена ** – Tushar

ответ

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 
+0

Я не знал, что будет накапливаться. за большой ответ. – Adam1980

0

это из-за !

Когда функция равна 0, она возвращает true.

Когда он 1, он вернется! (0) -> false.

Когда он равен 2, он вернется! Even (1) =>! (! Even (0)) =>! (False) => true.

Поскольку boolean является либо true, либо значением false, что означает два возможных значения, и вы переключаете их снова и снова, это работает.