可变附加函数(将任意数量的列表附加在一起)

Variadic append function (append any number of lists together)

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

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

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

我们只需要重复应用您的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)

Ó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)