算法入门day02

本文介绍了神奇的兔子序列,通过分析兔子繁殖情况引出斐波那契数列。详细阐述了斐波那契数列的递推公式,并设计了一个递归算法。同时探讨了算法改进的可能性,提出利用数组存储前两项以降低时间复杂度。
摘要由CSDN通过智能技术生成

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)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值