golang实现斐波那契数列(兔子问题)


斐波那契数列

斐波那契数列(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

文章作者: Jack Li
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Li !
评论
  目录