斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…
这个数列从第3项开始,每一项都等于前两项之和。
兔子问题
已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后,第三个月开始生小兔子,假如一年内没有发生死亡,则一对兔子开始,第N个月后会有多少对?
分析如下:
月份 | 一月 | 二月 | 三月 | 四月 | 五月 | 六月 | 七月 | … |
---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 1 | … | |
1 | 1 | 1 | 1 | 1 | … | |||
1 | 1 | 1 | 1 | … | ||||
1 | 1 | 1 | … | |||||
1 | 1 | 1 | … | |||||
1 | 1 | … | ||||||
1 | 1 | … | ||||||
1 | 1 | … | ||||||
1 | … | |||||||
1 | … | |||||||
1 | … | |||||||
1 | … | |||||||
1 | … | |||||||
总数(对) | 1 | 1 | 2 | 3 | 5 | 8 | 13 | … |
通过以上分析可以发现,兔子生育规律和斐波那契数列规律相同,从第三个月起,每月的兔子总数是前两个月的兔子之和,代码实现如下:
package main
import "fmt"
func main() {
var n = 7
RS := Rabit(n)
RS2 := Fib(n)
fmt.Printf("递归:第%d个月一共有%d对兔子!\n", n, RS)
fmt.Printf("元组赋值:第%d个月一共有%d对兔子!", n, RS2)
}
//定义一个函数,接收一个年份n
//用递归实现
func Rabit(n int) int {
for {
if n == 2 || n == 1 {
return 1
}
return Rabit(n-1) + Rabit(n-2)
}
}
//元组赋值
func Fib(n int) int {
x, y = 0, 1
for i := 0; i < n; i++ {
x, y = y, x+y
}
return x
}
// 这种写法可能有些人会把自己给绕进去,从而看不太懂,这里的y一直记录着当前月份的总兔子数,下面这种写法可能会比较好理解
func Fib2(n int) int {
x, y = 0, 1
for i := 2; i <= n; i++ {
x, y = y, x+y
}
return y
}
输出结果为:
递归:第7个月一共有13对儿兔子!
元组赋值:第7个月一共有13对儿兔子!
Process finished with exit code 0