在满足基本情况后,Scheme如何返回递归过程的“建立”值?

时间:2014-02-06 09:44:47

标签: recursion scheme mit-scheme

我正在浏览Simply Scheme,然后进入递归部分。

我不明白为什么在满足基本情况时Scheme返回递归过程的“build up”值,而不是导致基本情况计算为#t的实际参数值。

例如,看一下递归过程的示例代码片段,它将一个单词作为输入,将其反转并将其吐出:

(define (reverse wd)
  (if (empty? wd) wd
      (word (last wd) (reverse (bl wd)))))

这让我感到困惑:(if (empty? wd) wd

我理解当形式参数wd的实际参数值为空(或"")时,基本情况的计算结果为#t,导致第二个参数的值为{ {1}}进行评估。

理解的是if(在这种情况下为if)的第二个参数如何返回非空的内容,即使它看起来像是触发基本情况的相同的空的正式参数。

我错过了什么?

如果文档(或文本)中有什么内容可以解释这一点,我很乐意对其进行审核。

2 个答案:

答案 0 :(得分:2)

由于状态在这里没有改变,你可以用它的递归替换函数的作用。想象一下,你有两个字母a

(reverse a) ; =>
(word (last a) (reverse (bl a))) ; ==>
(word (last a) (word (last (bl a)) (reverse (bl (bl a))))) ; ==>
(word (last a) (word (last (bl a)) (bl (bl a)))) ; ==>
(word (last a) (word (last (bl a)) '()))

最后一次(bl (bl a))是最后一次迭代完成的唯一事情,它是'()。 剩下的工作是继续之前的电话。

修改

澄清..想象一下是“ab”

(reverse "ab") ; turns into
(word (last "ab") (reverse (bl "ab")))           ; tuns into
(word "b" (reverse (bl "ab")))                   ; turns into 
(word "b" (reverse "a")))                        ; turns into 
(word "b" (word (last "a") (reverse (bl "a"))))) ; turns into
(word "b" (word "a" (reverse ""))))

现在查看最后一个..当(reverse "")返回“”时,它是上一次表单调用中使用的结果,在word表单中,因此您将获得(word "a" "") ==> "a",然后它将返回到(word "b" "a")的第一个调用。这些都是延续。

答案 1 :(得分:1)

关键的洞察力是 为基本案例返回空。那是因为空字符串的反转是一个空字符串。

递归案例实际上适用于该假设。用语言来说,这是reverse函数的工作原理:

  1. 如果给定的单词为空,则返回空。
  2. 否则,请取出该单词的最后一个字母,然后将其与该单词的其余部分相反加入。
  3. 实施例。假设我们正在逆转“德文”:

    • “Devin”这个词不是空的,所以我们将以“Devi”的反面加入“n”。
      • “Devi”这个词不是空的,所以我们将以“Dev”的反向加入“i”。
        • 单词“Dev”不为空,所以我们将以“De”的反向加入“v”。
          • 单词“De”不为空,所以我们将以“D”的反向加入“e”。
            • 单词“D”不为空,所以我们将以“”反向加入“D”。
              • 单词“”为空,所以我们返回“”。
            • 在这里,我们返回“D”加上“”,即“D”。
          • 在这里,我们返回“e”与“D”连接,即“eD”。
        • 在这里,我们返回“v”与“eD”连接,这是“veD”。
      • 在这里,我们返回“i”加入“veD”,即“iveD”。
    • 在这里,我们返回“n”加入“iveD”,即“niveD”。