Clojure Koans рекурсивен - даже? - PullRequest
13 голосов
/ 02 мая 2011

Я работаю через Clojure Koans и до рекурсивных коанов.

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

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

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

Ответы [ 3 ]

15 голосов
/ 02 мая 2011

Как сказал Амаллой, заполните пробелы "не".Но при условии, что вы предполагаете, что аргумент может быть только 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

прочее.

9 голосов
/ 02 мая 2011

Число n является четным, если либо:

  1. n равно 0
  2. n-1 НЕ даже

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

0 голосов
/ 02 мая 2011

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

РЕДАКТИРОВАТЬ: Видимо, я пропустил заметку о заполнении пробела.Вот оптимальное решение для хвостового вызова, которое я имел в виду для положительных целых чисел:

(defn is-even? [n]
    (if (<= n 1)
        (= n 0)
        (is-even? (- n 2))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...