您好我正在查看附加功能
(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?
答案 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个嵌套,然后它会评估内部到外部,因为列表总是从头到尾创建,因为函数需要评估申请前的论点。