你的函数有一个错误,因此在解析中最后有一个关闭对象太多。因为您在y
之后关闭if
,所以我减少了套件的数量。因为它会一直做最后一个表达式,当x
为空时它失败。
正确的追加看起来是这样的:
(define (append x y)
(if (null? x)
y
(cons (car x)
(append (cdr x)
y))))
我喜欢简单的一般解释递归函数,所以我们开始与明显,基本情况:
(append '() '(3 4))
这将是#t
对于x
是null?
,结果是(3 4)
。现在,让我们尝试用一个元素列表作为x
:
(append '(2) '(3 4))
这是#f
为x
是`空?因此,你可以用它替换:
我们可以评估访问器上'(2)
:
(cons 2 (append '() '(3 4))
因为我们做的基本情况,才知道答案的append
的一部分,这是'(3 4)
所以我们结束:
(cons 2 '(3 4)) ; ==> (2 3 4)
让我们做一个新的x
:
(append '(1 2) '(3 4))
这里作为先前x
不是null?
所以你再次与替代替代:
(cons (car '(1 2))
(append (cdr '(1 2))
'(3 4)))
正如前面的时候,我们可以评估的访问者:一遍
(cons 1
(append '(2)
'(3 4)))
通知我们有熟悉的论点append
,所以我们可以用我们的最后结果替代,但我采取了前面的步骤,所以你看到你注意到的模式:
(cons 1 (cons 2 (append '() '(3 4)))) ; ==>
(cons 1 (cons 2 '(3 4))) ; ==>
(cons 1 '(2 3 4)) ; ==>
; ==> (1 2 3 4)
所以,如果你有一个12元x
它得到12个利弊嵌套击中基本情况之前,然后评估内到外,因为列表总是从最终创建之初,因为功能需要评估他们的论点应用之前。