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个月后会有多少对?

分析如下:

月份一月二月三月四月五月六月七月
1111111
11111
1111
111
111
11
11
11
1
1
1
1
1
总数(对)11235813

通过以上分析可以发现,兔子生育规律和斐波那契数列规律相同,从第三个月起,每月的兔子总数是前两个月的兔子之和,代码实现如下:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李柏林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值