【问题标题】:Clojure Koans recursive is-even?Clojure Koans 递归是偶数?
【发布时间】:2011-08-16 18:13:30
【问题描述】:

我正在研究 Clojure Koans,我正在研究递归 koans。

我不明白如何使用递归解决is-even?。练习部分将此函数定义为:

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

如果我不想使用递归,那么我会将其定义为 (defn is-even? [n] (= (mod n 2) 0)),但这与练习的要点相悖。

【问题讨论】:

  • 如果你不开始求解is-even?函数,而是从meditations块中的第一个Koan开始,这个Koan更容易理解。这有点令人困惑,但公案会慢慢建立起来,这就是您需要开始的地方。

标签: recursion clojure


【解决方案1】:

就像 amalloy 所说,用“不”填空。但是,如果您假设参数只能为 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 是即使:

    1. n 为 0
    2. n-1 甚至都不是

    真的,not 应该足以填补这个空白。最终你会在(= 0 0) 附近得到 N 个nots,并且它们中的大多数都抵消了。

    【讨论】:

      【解决方案3】:

      考虑每次递归减 2。其余的应该很明显:只有当函数以零结尾时,数字才是偶数。

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

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

      【讨论】:

      • 可以使用recur函数进行尾调用优化
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多