Variadic附加功能(将任意数量的列表附加在一起)

时间:2016-02-08 16:20:20

标签: lambda scheme racket variadic-functions

我正在尝试自己实现方案程序追加。最简单的版本是将2个列表附加在一起非常简单,可以通过以下方式完成:

 (define (append lis1 lis2)
                  (if (null? lis1) 
                    lis2
                    (cons (car lis1)
                          (append (cdr lis1) lis2))))

当你想追加任何数量的列表时,麻烦就开始了。对于0个列表和1个列表,这个想法很简单,但我很难想到如何将此过程应用于任意数量的列表...... 任何帮助,将不胜感激, 奥伦

2 个答案:

答案 0 :(得分:3)

我们只需重复应用您的append功能,foldr就是工作的工具。试试这个:

(define (append* . lsts)
  (foldr (lambda (sublist acc)
           (append sublist acc))
         '()
         lsts))

例如:

(append* '(1 2) '(3) '(4 5 6) '(7 8))
=> '(1 2 3 4 5 6 7 8)

答案 1 :(得分:3)

Óscar的答案很好,但我可能会reverse输入并使用foldl而不是foldl是通过适当的尾调用来实现的。

(define (append* . xs)
  (foldl append null (reverse xs)))

输出相同

(append* '(1 2) '(3) '(4 5 6) '(7 8))
=> '(1 2 3 4 5 6 7 8)