Clojure Коанс рекурсивный-четный?

Я работаю через Clojure Коанс, и я добираюсь до коня-рекурсии.

Я не понимаю, как решить is-even? с помощью рекурсии. Упражнение частично определяет эту функцию как:

(defn is-even? [n]
    (if (= n 0)
        true
        (__ (is-even? (dec n)))))

Если я не хочу использовать рекурсию, я бы определил ее как (defn is-even? [n] (= (mod n 2) 0)), но это противоречит точке упражнения.

Ответы

Ответ 1

Как сказал амаллоя, заполните пробелы "нет". Но если вы предположили, что аргумент может быть только 0 или положительным, вам не нужен другой базовый случай: dec гарантирует, что вы всегда заканчиваете на 0, а нечетные числа возвращают false следующим образом:

(is-even? 0) ==> base case (= 0 0) ==> true.
(is-even? 1) ==> (not (is-even? (dec 1))
             ==> (not (is-even? 0))
             ==> (not true)
             ==> false
(is-even? 2) ==> (not (is-even? 1))
             ==> (not false)
             ==> true

и так далее.

Ответ 2

Число n даже если:

  • n= 0
  • n-1 НЕ даже

Так что, действительно, not должно быть достаточно, чтобы заполнить этот пробел. В конце концов вы заканчиваете с N not вокруг (= 0 0), и большинство из них отменяется.

Ответ 3

Рассмотрим декремент на 2 для каждой рекурсии. Остальное должно быть очевиден: число даже в том случае, если функция заканчивается нулем.

EDIT: По-видимому, я пропустил записку о заполнении бланка. Вот оптимальное решение хвостового вызова, которое я имел в виду для целых положительных чисел:

(defn is-even? [n]
    (if (<= n 1)
        (= n 0)
        (is-even? (- n 2))))