Scheme附加功能工作流程

时间:2017-01-21 16:42:42

标签: scheme

您好我正在查看附加功能

(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 an y),是因为最终表达式是(cons an-1,追加(cdr x)y)和(append(cdr x),y)的结果是y?

1 个答案:

答案 0 :(得分:0)

你的函数中有一个错误,因此在解析时最终有一个关闭的parens太多了。我精简套件是因为您在if之后关闭了y。因为它始终会执行最后一个表达式,并且在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 (cons (car '(2)) (append (cdr '(2)) '(3 4))) 为空?因此你可以用以下代替它:

'(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) 提供了熟悉的参数,因此我们可以用我们的最后一个结果替换它,但是我采取了以前的步骤,因此您看到了您注意到的模式:

x

因此,如果你有一个12个元素struct.error: argument for 's' must be a bytes object ,它会在命中基础案例之前得到12个嵌套,然后它会评估内部到外部,因为列表总是从头到尾创建,因为函数需要评估申请前的论点。