从N个列表中获取一个列表,有时还列出一个列表

时间:2019-03-11 15:57:44

标签: functional-programming scheme

我还在学习计划。

如果具有以下两个列表列表:

'((1 2 (3 4) 5) (12 13 4))
'((3 4 9) (7 6 5 4))

我要获取此列表:

'((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))

但使用cons

(cons '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)))

我得到以下列表:

'(((1 2 (3 4) 5) (12 13 4)) (3 4 9) (7 6 5 4))

注意

在此示例中,两个列表都有两个子列表。但是他们可以有n个子列表。

我尝试过使用append,但是当列表列表中的一个仅是一个列表时,它不起作用:

(append '(1 2 3 4) '((23 24 25 26) (a b c)))
> '(1 2 3 4 (23 24 25 26) (a b c))

是否有执行此操作的功能,或者我必须实现它?

1 个答案:

答案 0 :(得分:2)

您想要的行为非常具体,您不会在标准库中找到它。好消息是,假设输入列表是非空的,那么以覆盖所有可能情况的便携式且高效的方式实现是很简单的:

(define (my-append lst1 lst2)
  (cond ((and (pair? (car lst1)) (pair? (car lst2)))
         (append lst1 lst2))
        ((pair? (car lst1))
         (append lst1 (list lst2)))
        ((pair? (car lst2))
         (append (list lst1) lst2))
        (else
         (append (list lst1) (list lst2)))))

例如:

(my-append '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)))
=> '((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))

(my-append '(1 2 3 4) '((23 24 25 26) (a b c)))
=> '((1 2 3 4) (23 24 25 26) (a b c))