【问题标题】:Trying to understand recursion in Clojure试图理解 Clojure 中的递归
【发布时间】:2021-05-29 03:17:49
【问题描述】:

我是初学者,真的很想理解,所以请多多包涵。

我正在研究 Clojure Koans,但在理解递归时遇到了一些麻烦。

我被这个问题困住了:Clojure Koans recursive is-even?

这是正确的函数:

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

这些都是很好的例子:

(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

但我很困惑为什么递归不会一直发生,直到你每次都留下 0。

例如,n=2。以下是我如何推断我脑海中发生的事情:2 不等于 0,那么 (not (is-even?1)) 被评估。当这被评估时, 1 被插入 is-even?功能。因为 1 不等于 0,所以这个陈述是错误的,但是这个错误陈述不会被传递给 (not (is-even? (dec 1))?对于所有 n>0,他们会在这个循环直到它们等于 0?

我觉得有一些我不明白的基本概念:(我非常感谢所有输入并希望学到很多东西。

【问题讨论】:

    标签: recursion clojure


    【解决方案1】:

    我不太确定我是否按照您的要求进行操作,但也许混淆来自他们为(is-even? 2) 编写示例的方式,因为他们采取了捷径并直接从(not (is-even? 1)) 转到(not false) 而不是走他们已经为上面的(is-even? 1) 显示的相同步骤,即它被视为(not (is-even? (dec 1))),即(not (is-even? 0)),即(not true)——他们直接跳到false .

    这是否阐明了这些示例的含义?如果没有,您能否尝试在示例中阐明您迷路的地方?

    【讨论】:

    • 感谢 Sean,添加额外的步骤对我帮助很大!
    【解决方案2】:

    但我很困惑为什么递归不会一直发生,直到 每次都剩下 0。

    确实如此。评价的先后顺序是

    (is-even? 2)
    (not (is-even? 1))
    (not (not (is-even? 0)))
    (not (not true))
    (not false)
    true
    

    对于任何积极的long n,我们得到一个级联的n nots 环绕(is-even? 0)

    • (is-even? 0) 的计算结果为 true
    • 每两个nots 相互取消。
    • 所以,
      • 如果n 是偶数,我们就没有nots,函数计算 true;否则,
      • 如果n 是奇数,我们还剩下一个not,函数计算 (not true),即false

    【讨论】:

    • 感谢您的帮助!不知何故,我没有记住所有不断添加的不。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多