斐波那契数列又称黄金分割数列,因数学家列昂纳多.斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。莱昂纳多是一位著名的意大利数学家 , 最重要的成就是发现了一组可以描述自然比例数字 0、1、1、2、3、5、8、13、21、34、55、89……,观察该数列可以发现前2项的数字相加等于后一项的数字,比如 1+1=2;1+2=3;2+3=5;3+5=8;5+8=13。
F(1)=1
F(2)=1
F(n)=F(n - 1)+F(n - 2) (n ≥ 3)
有趣的是,而前一项与后一项的比值组成的数列竟然存在极限,且这个极限值恰好就是美学中非常重要的黄金分割比。例如 F(9)/F(10) = 0.618182 。
F(n)/F(n+1) -> 0.618
go语言算法实现
package main
import "fmt"
func fib(n int) int {
x, y := 0, 1
for i := 0; i < n; i++ {
x, y = y, x+y
}
return x
}
func main() {
for x := 1; x <= 20; x++ {
r := fmt.Sprintf("F(%d) = %d", x, fib(x))
fmt.Println(r)
}
for x := 20; x > 3; x-- {
r := fmt.Sprintf("F(%d)/F(%d) = %.4f", x, x+1, float64(fib(x))/float64(fib(x+1)))
fmt.Println(r)
}
}
执行结果
F(1) = 1
F(2) = 1
F(3) = 2
F(4) = 3
F(5) = 5
F(6) = 8
F(7) = 13
F(8) = 21
F(9) = 34
F(10) = 55
F(11) = 89
F(12) = 144
F(13) = 233
F(14) = 377
F(15) = 610
F(16) = 987
F(17) = 1597
F(18) = 2584
F(19) = 4181
F(20) = 6765
F(20)/F(21) = 0.6180
F(19)/F(20) = 0.6180
F(18)/F(19) = 0.6180
F(17)/F(18) = 0.6180
F(16)/F(17) = 0.6180
F(15)/F(16) = 0.6180
F(14)/F(15) = 0.6180
F(13)/F(14) = 0.6180
F(12)/F(13) = 0.6180
F(11)/F(12) = 0.6181
F(10)/F(11) = 0.6180
F(9)/F(10) = 0.6182
F(8)/F(9) = 0.6176
F(7)/F(8) = 0.6190
F(6)/F(7) = 0.6154
F(5)/F(6) = 0.6250
F(4)/F(5) = 0.6000
求极限的算法在一些场合经常用到,y=f(x),y随着x的增长,始终不超过某个极限值。