可变附加函数(将任意数量的列表附加在一起)
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)
我正在尝试自己实施方案程序 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)