我只是想知道你们是否可以想到在Swift中实现这种无限add
函数。
let result = add(1)(2)(3)(4)(5)() // 15
我有两个参数调用let res = add(1)(2)
的基本解决方案,但似乎找到了处理无限数字的方法。
func add(a: Int) -> (Int) -> (Int) {
return { b in a + b }
}
我想最后的()
需要指出'停止返回一个函数但返回结果'。
答案 0 :(得分:2)
不幸的是,在Swift中你无法计算任意数量的参数。 (Some functional libraries go to great lengths to give you behaviour that's kind of like it - but it's limited at a certain number)
要总结无限列表,您需要像扫描这样的函数:
extension SequenceType {
func scan<T>(var initial: T, combine: (T, Generator.Element) -> T) -> LazySequence<MapSequence<Self, T>> {
return lazy(self).map {
element -> T in
initial = combine(initial, element)
return initial
}
}
}
其中的作用如下:
[1, 2, 3, 4, 5].scan(0, combine: +) // [1, 3, 6, 10, 15]
但是,既然你正在使用的列表是无限的,如果你想在没有分歧的情况下使用它,你需要一个像take这样的函数:
extension SequenceType {
func take(var n: Int) -> [Generator.Element] {
var g = self.generate()
var ret: [Generator.Element] = []
while --n >= 0, let next = g.next() { ret.append(next) }
return ret
}
}
所以你可以像这样使用它:
(1..<100).scan(0, combine: +).take(10) // [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
答案 1 :(得分:1)
我能想到的最接近的是一个可变的解决方案,如果你想要它比vadian之前的答案更有用,也许使用reduce而不是循环...
func sumOf(numbers: Int ...) -> Int {
return numbers.reduce(0, combine: +)
}
sumOf(1, 2, 3, 4, 5) // returns 15
答案 2 :(得分:0)
你的意思是带有varidic参数的函数吗?
从Swift语言指南中稍加改动
func sumOf(numbers: Int...) -> Int {
var total: Int = 0
for number in numbers {
total += number
}
return total
}
sumOf(1, 2, 3, 4, 5) // 15
sumOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) // 55