你的函數有一個錯誤,因此在解析中最後有一個關閉對象太多。因爲您在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個利弊嵌套擊中基本情況之前,然後評估內到外,因爲列表總是從最終創建之初,因爲功能需要評估他們的論點應用之前。