我正在尝试自己实现方案程序追加。最简单的版本是将2个列表附加在一起非常简单,可以通过以下方式完成:
(define (append lis1 lis2)
(if (null? lis1)
lis2
(cons (car lis1)
(append (cdr lis1) lis2))))
当你想追加任何数量的列表时,麻烦就开始了。对于0个列表和1个列表,这个想法很简单,但我很难想到如何将此过程应用于任意数量的列表...... 任何帮助,将不胜感激, 奥伦
答案 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)