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
даже если:
Так что, действительно, not
должно быть достаточно, чтобы заполнить этот пробел. В конце концов вы заканчиваете с N not
вокруг (= 0 0)
, и большинство из них отменяется.
Ответ 3
Рассмотрим декремент на 2 для каждой рекурсии. Остальное должно быть очевиден: число даже в том случае, если функция заканчивается нулем.
EDIT: По-видимому, я пропустил записку о заполнении бланка. Вот оптимальное решение хвостового вызова, которое я имел в виду для целых положительных чисел:
(defn is-even? [n]
(if (<= n 1)
(= n 0)
(is-even? (- n 2))))