我正在通过Clojure Koans工作,我接受了递归公案。
我不明白如何使用递归来解决is-even?
。练习部分将此功能定义为:
(defn is-even? [n]
(if (= n 0)
true
(__ (is-even? (dec n)))))
如果我不想使用递归,那么我会将其定义为(defn is-even? [n] (= (mod n 2) 0))
,但这违背了练习的要点。
答案 0 :(得分:15)
就像阿马洛伊说的那样,用“不”填补空白。但是假设您假设参数只能是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
等等。
答案 1 :(得分:9)
数字n
即使是:
n
为0 n-1
甚至不是所以,not
应该足以填补空白。最终,您会在not
周围找到N (= 0 0)
个,其中大多数会取消。
答案 2 :(得分:0)
考虑每次递归递减2。其余的应该是显而易见的:只有当函数最终为零时,数字才是偶数。
编辑:显然我错过了关于填空的备忘录。这是我想到的正整数的尾调用可优化解决方案:(defn is-even? [n]
(if (<= n 1)
(= n 0)
(is-even? (- n 2))))