2017-01-21 97 views
0

你好我在看的附加功能方案附加功能的工作流

(define (append x y) 
    (if (null? x) 
     y) 

    (cons (car x) 
     (append (cdr x) 
       y)))) 

我知道如何生成的列表中,但是當第一個列表x是空的,我們直接返回Y,我看不出我們如何連接它到第一個列表「x」。過程是否像這樣(cons a1(cons a2 ....(cons an y)..))以及程序如何理解插入y(cons和y) ,是因爲最後表達式是(cons an-1,append(cdr x)y)和(append(cdr x),y)的結果是y嗎?

回答

0

你的函數有一個錯誤,因此在解析中最後有一個關閉對象太多。因爲您在y之後關閉if,所以我減少了套件的數量。因爲它會一直做最後一個表達式,當x爲空時它失敗。

正確的追加看起來是這樣的:

(define (append x y) 
    (if (null? x) 
     y 
     (cons (car x) 
      (append (cdr x) 
        y)))) 

我喜歡簡單的一般解釋遞歸函數,所以我們開始與明顯,基本情況:

(append '() '(3 4)) 

這將是#t對於xnull?,結果是(3 4)。現在,讓我們嘗試用一個元素列表作爲x

(append '(2) '(3 4)) 

這是#fx是`空?因此,你可以用它替換:

​​

我們可以評估訪問器上'(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個利弊嵌套擊中基本情況之前,然後評估內到外,因爲列表總是從最終創建之初,因爲功能需要評估他們的論點應用之前。