Scheme 如何在LISP中附加两个列表的第一个元素

Scheme 如何在LISP中附加两个列表的第一个元素,scheme,lisp,Scheme,Lisp,我对LISP很生疏,我正试图把2个列表合并起来 (define (append lst1 lst2) (if (null? lst1) lst2 (cons (car lst1) (append (cdr lst2) lst2)))) (append '(1 2 3) '(4 5 6 7 8)) 这导致 (12345678) 我想要两个列表的第一个元素,如果为空,它将填充另一个列表的其余部分 (1 4 2 5 3 6 7 8)你很接近了。您需要在每个递归

我对LISP很生疏,我正试图把2个列表合并起来

(define (append lst1 lst2)
        (if (null? lst1) lst2
            (cons (car lst1) (append (cdr lst2) lst2))))
(append '(1 2 3) '(4 5 6 7 8))
这导致

(12345678)

我想要两个列表的第一个元素,如果为空,它将填充另一个列表的其余部分


(1 4 2 5 3 6 7 8)

你很接近了。您需要在每个递归调用上切换列表输入的顺序,以便可以选择结果列表采用哪个元素。您还应该将
append
重命名为其他名称,因为您并没有真正执行append过程,而且该名称有点误导:

(define (merge lst1 lst2)
  (if (null? lst1)
      lst2
      (cons (car lst1) (merge lst2 (cdr lst1)))))
>(合并(1234)(45678))
(1 4 2 5 3 6 7 8)

你很接近了。您需要在每个递归调用上切换列表输入的顺序,以便可以选择结果列表采用哪个元素。您还应该将
append
重命名为其他名称,因为您并没有真正执行append过程,而且该名称有点误导:

(define (merge lst1 lst2)
  (if (null? lst1)
      lst2
      (cons (car lst1) (merge lst2 (cdr lst1)))))
>(合并(1234)(45678))
(1 4 2 5 3 6 7 8)

这不是常见的Lisp;这看起来像是个骗局。此外,这肯定不是给出您建议的结果的实际代码:
list1
list2
不是此处定义的
append
的参数。当拼写错误被纠正时,这段代码应该可以工作。@adabsurdum已纠正,但它仍然返回(12345678),这是不正确的,因为我希望(124253678)我错过了排序位;你还有两个打字错误:
list2
->
lst2
,和
(123456)
->
(12345678)
@adabsurdum啊,是的,谢谢!这不是常见的口齿不清;这看起来像是个骗局。此外,这肯定不是给出您建议的结果的实际代码:
list1
list2
不是此处定义的
append
的参数。当拼写错误被纠正时,这段代码应该可以工作。@adabsurdum已纠正,但它仍然返回(12345678),这是不正确的,因为我希望(124253678)我错过了排序位;你还有两个打字错误:
list2
->
lst2
,和
(123456)
->
(12345678)
@adabsurdum啊,是的,谢谢!您需要检查两个列表是否都为空,然后返回另一个,否则您会遇到麻烦。@tfb--我测试了错误的列表;您只需要测试
lst1
,因为它是由
car
操作的。谢谢你的ping;)哦,是的,没错。您将得到一个额外的调用(这显然无关紧要),但代码更易于阅读。您需要检查两个列表是否为空,然后返回另一个列表,否则您会遇到麻烦。@tfb--我测试了错误的列表;您只需要测试
lst1
,因为它是由
car
操作的。谢谢你的ping;)哦,是的,没错。您将得到一个额外的调用(显然这并不重要),但代码更易于阅读。