我正在浏览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
)的第二个参数如何返回非空的内容,即使它看起来像是触发基本情况的相同的空的正式参数。
我错过了什么?
如果文档(或文本)中有什么内容可以解释这一点,我很乐意对其进行审核。
答案 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
函数的工作原理:
实施例。假设我们正在逆转“德文”: