方案:在某一点组合列表

时间:2012-10-06 18:53:33

标签: list scheme

我正在尝试定义一个带有2个列表和非负整数的参数的过程。假设完美输入。我希望它构建第一个列表中的元素列表UNTIL它到达给定的元素整数,此时我想用第二个列表中的其余元素完成它。让我演示一下。

~(combine '(a b c d e) '(w x y z) 2)
(a b y z)

请注意,第二个列表从下一个索引继续,就好像它一直是cdr一样。

这就是我所拥有的。它当然不起作用,我想我可能使用了错误的逻辑。

(define (combine seq1 seq2 point)
 (if (null? (or seq1 seq2))
   '()
   (if (equal? point 0)
       (cons seq2 '())
       (cons (car seq1) (combine (cdr seq1) (cdr seq2) (- point 1) )))))

所有帮助将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:2)

嗯,这条线不能做你想做的事:

(if (null? (or seq1 seq2))

在Scheme中,空列表是 true 值; Scheme中 false值为 #f 。这意味着

(or '() '(a))

返回'(),但

(or '(a) '())

返回'(a)

因此,检查null将仅返回#t的一半时间。 (如果'()是假值,就像在常规Lisp中一样,那么永远不会工作,所以我不确定是什么你在想。)

如果你希望该行返回true,如果其中一个列表为null,你将不得不重新考虑它。

然后是

(cons seq2 '())

尝试自己测试该功能,看看会发生什么 - 它不是你需要的。如果你考虑一下,那条线应该相当简单。那时你真的需要回报什么?