我想在不使用递归的情况下对列表中的数字求和。我知道你可以总结这样的数字列表
(+ num1 num2 ... numN)
但如果你有一个等于'(num1 num2 ... numN)的列表L怎么办? 有没有办法让+把这个列表中的数字作为参数。我需要在没有递归或辅助函数的情况下执行此操作。
答案 0 :(得分:11)
当然,只需使用apply
:
(apply + '(1 2 3 4 5 6)) ; same as (+ 1 2 3 4 5 6)
(apply + 1 2 3 '(4 5 6)) ; ditto
(apply + 1 2 3 4 5 '(6)) ; ditto
(apply + 1 2 3 4 5 6 '()) ; ditto
答案 1 :(得分:3)
对于你似乎要问的问题的一般答案 - 如何列出并使用它作为参数 - 是apply
,正如Chris Jester-Young所回答的那样。
但是,对于这个特定问题,可能还有其他一些考虑因素。您可能想要对任意大小的列表求和。但是,实现通常会对可以调用函数的参数数量进行一些限制。更可靠的解决方案可能是使用某种fold函数(各种实现具有不同的折叠函数)来折叠+
列表。