2017-01-21 57 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个利弊嵌套击中基本情况之前,然后评估内到外,因为列表总是从最终创建之初,因为功能需要评估他们的论点应用之前。