Swift 中的斐波那契单线
Fibonacci one-liner in Swift
我正在尝试一些代码高尔夫,我有这个功能:
func fibonacci(n: Int) {
var x1=0
var x2=1
var arr = [Int]()
for _ in 1...n {
arr.append(x1)
let temp = x1+x2
x1 = x2
x2 = temp
}
print(arr)
}
我想尝试单线,即:
print((1...n).reduce(([Int](),[0,1]), { ([=12=].0 + [[=12=].1[0]],[.1[1],.1[1]+.1[0]])}))
但是我收到了这个蹩脚的编译器消息:
the compiler is unable to type-check this expression in reasonable
time; try breaking up the expression into distinct sub-expressions
有更好的方法吗?谢谢
您不需要实际构建 Array
。您可以使用 the sequence
function 一次生成一个斐波那契数列:
sequence(first: (0, 1)) { a, b in (b, a + b) }
.prefix(10)
.forEach { a, _ in print(a) }
输出:
0
1
1
2
3
5
8
13
21
34
如果您想了解更多关于 sequence
的理论基础,请阅读 anamorphisms。
使用所有默认参数很难阅读您的尝试。之一
尝试这样做的问题是传递给 reduce
的 Int
在闭包内部实际上并不需要,您需要告诉 Swift 忽略它。使用默认参数很难做到这一点,但如果您添加显式参数,您可以使用 _
作为您想要忽略的参数。
这是一个使用两个 reduce
语句的解决方案:
print((1...n).reduce([0, 1]) { (f, _) in f + [f.suffix(2).reduce(0, +)] })
第二个reduce
用于添加由.suffix(2)
获得的前一次迭代的最后两个元素,然后使用+
.
附加到数组
除了使用第二个 reduce
,您还可以只添加最后两个值:
print((1...n).reduce([0, 1]) { (f, _) in f + [f.last! + f[f.count - 2]] })
我正在尝试一些代码高尔夫,我有这个功能:
func fibonacci(n: Int) {
var x1=0
var x2=1
var arr = [Int]()
for _ in 1...n {
arr.append(x1)
let temp = x1+x2
x1 = x2
x2 = temp
}
print(arr)
}
我想尝试单线,即:
print((1...n).reduce(([Int](),[0,1]), { ([=12=].0 + [[=12=].1[0]],[.1[1],.1[1]+.1[0]])}))
但是我收到了这个蹩脚的编译器消息:
the compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
有更好的方法吗?谢谢
您不需要实际构建 Array
。您可以使用 the sequence
function 一次生成一个斐波那契数列:
sequence(first: (0, 1)) { a, b in (b, a + b) }
.prefix(10)
.forEach { a, _ in print(a) }
输出:
0
1
1
2
3
5
8
13
21
34
如果您想了解更多关于 sequence
的理论基础,请阅读 anamorphisms。
使用所有默认参数很难阅读您的尝试。之一
尝试这样做的问题是传递给 reduce
的 Int
在闭包内部实际上并不需要,您需要告诉 Swift 忽略它。使用默认参数很难做到这一点,但如果您添加显式参数,您可以使用 _
作为您想要忽略的参数。
这是一个使用两个 reduce
语句的解决方案:
print((1...n).reduce([0, 1]) { (f, _) in f + [f.suffix(2).reduce(0, +)] })
第二个reduce
用于添加由.suffix(2)
获得的前一次迭代的最后两个元素,然后使用+
.
除了使用第二个 reduce
,您还可以只添加最后两个值:
print((1...n).reduce([0, 1]) { (f, _) in f + [f.last! + f[f.count - 2]] })