14天阅读挑战赛
努力是为了不平庸
时来运到,天下无敌
作者简介:造船专业的数据分析师,记录学习经验和学习笔记。
点赞,收藏,评论,支持一下博主~ 谢谢~~
神奇的兔子序列
比如,我开篇提到的“兔子数列”。假设一开始有两只兔子,一公一母,两个月后开始繁殖,一对兔子每个月能且只能生出一对小兔子来,假设兔子都不会死亡,那么一年之后可以繁殖多少对兔子?
分析:
第一个月和第二个月,兔子没有繁殖能力,所以是一对;
第三个月,兔子有了繁殖能力,生下了一对小兔子,现在兔子是两对;
第四个月,大兔子依旧可以生下一对小兔子,由于现在小兔子还未成年,没有繁殖能力,所以,现在兔子是三对;
四个月后,小兔子长大了成为了小老兔子,可以和大老兔子一起繁殖,这时候就拥有了五对兔子
由上述分析可知:
当月的兔子数=上月的兔子数+上上月的兔子数
从而构成一组斐波那契数列。
斐波那契数列构成如下:
1,1,2,3,5,8,13,21,34,…
从第二个数开始有F(n)=F(n-1)+F(n-2)。
2.设计算法
首先按照递归表达式设计一个递归算法
Fib1(int n)
{
if(n<1)
return -1;
if(n==1||n==2)
return 1;
return Fib1(n-1)+Fib1(n-2);
}
第一个问题毋庸置疑,因为算法是完全按照递推公式写出来的,所以正确性没有问题。
算法改进
既然斐波那契数列中的每一项是前两项之和,如果记录前两项的值,只需要一次加法运算就可以得到当前项,时间复杂度会不会更低一些?我们用数组试试看
Fib2(int n) { if(n<1) return -1; int *a=new int[n];//定义一个数组 a[1]=1; a[2]=1; for(int i=3;i<=n;i++) a[i]=a[i-1]+a[i-2]; return a[n]; }
有趣的是:这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当 n趋向于无穷大时,斐波那契数列前一项与后一项的比值越来越逼近黄金分割比0.618:1÷1 = 1,1÷2 = 0.5,2÷3 = 0.666,…,3÷5 = 0.6,5÷8 = 0.625,…,55÷89 = 0.617977,…,144÷233 = 0.618025,…,46368÷75025 = 0.6180339886……
一行代码实现斐波那契数列
n = int(input("请输入数列的项数:"))
fibo = [x[0] for x in [(a[i][0], a.append([a[i][1], a[i][0]+a[i][1]])) for a in ([[1, 1]], ) for i in range(n)]]
print(fibo)