Clojure Koans递归是偶数吗?

时间:2011-05-02 05:27:34

标签: recursion clojure

我正在通过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 个答案:

答案 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即使是:

  1. n为0
  2. n-1甚至不是
  3. 所以,not应该足以填补空白。最终,您会在not周围找到N (= 0 0)个,其中大多数会取消。

答案 2 :(得分:0)

考虑每次递归递减2。其余的应该是显而易见的:只有当函数最终为零时,数字才是偶数。

编辑:显然我错过了关于填空的备忘录。这是我想到的正整数的尾调用可优化解决方案:

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