试图理解 Clojure 中的递归

Trying to understand recursion in Clojure

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

我正在研究 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 被插入是偶数?功能。因为 1 不等于 0,所以这个陈述是错误的,但是这个错误陈述不会被传递给 (not (is-even? (dec 1))?对于所有 n>0,他们会在这个过程中不断减少循环直到它们等于 0?

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

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

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

But I'm confused about why the recursion doesn't keep happening until you are left with 0 every time.

确实如此。连续的评价是

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

对于任何正数 long n,我们得到 n not 级联 (is-even? 0)

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