站长网站后台,文化建设ppt,app开发公司定制,阿里巴巴怎么优化关键词排名完整源代码项目地址#xff0c;关注博主私信’源代码’后可获取
1#xff0e;问题描述
有一对兔子#xff0c;从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子#xff0c;假设所有的兔子都不死#xff0c;问30个月内每个月的兔子总对数为…完整源代码项目地址关注博主私信’源代码’后可获取
1问题描述
有一对兔子从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子假设所有的兔子都不死问30个月内每个月的兔子总对数为多少
2问题分析
兔子产子问题是一个有趣的古典数学问题我们画一张表来找一下兔子数的规律如表1.1所示。 说明不满1个月的兔子为小兔子满1个月不满2个月的为中兔子满3个月以上的为老兔子。
可以看出每个月的兔子总数依次为11235813…这就是Fibonacci数列。总结数列规律即为从前两个月的兔子对数可以推出第3个月的兔子对数。
3算法设计
本题目是典型的迭代循环即是一个不断用新值取代变量的旧值然后由变量旧值递推出变量新值的过程。这种迭代与这些因素有关初值、迭代公式和迭代次数。经过问题分析算法可以描述为 用Python语言来描述迭代公式即为fibfib1fib2其中fib为当前新求出的兔子对数fib1为前一个月的兔子对数fib2为前两个月的兔子对数然后为下一次迭代做准备如图所示 进行如下的赋值fib2fib1fib1fib要注意赋值的次序迭代次数由循环变量控制为所求的月数。
4完整的程序
根据上面的分析编写程序如下
%%time
# 兔子产子问题if __name____main__:fib1 1fib2 1i 3# 输出第一个月和第二个月的兔子对数print(%6d %6d %(fib1, fib2), end )while i 30:fib fib1 fib2 # 迭代求出当前月份的兔子对数print(%6d %fib, end ) # 输出当前月份的兔子对数if i % 4 0:print() # 每行输出4个fib2 fib1 # 为下一次迭代做准备求出新的fib2fib1 fib # 求出新的fib1i 1 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811
514229 832040
CPU times: user 854 µs, sys: 970 µs, total: 1.82 ms
Wall time: 896 µs6问题拓展
这个程序虽然是正确的但可以进行改进。目前用3个变量来求下一个月的兔子对数其实可以在循环体中一次求出下两个月的兔子对数这样就可以只用两个变量来实现。这里将fib1fib2的结果不放在fib中而是放在fib1中此时fib1不再代表前一个月的兔子对数而是代表最新一个月的兔子对数再执行fib2fib1fib2由于此时fib1中已经是第3个月的兔子对数了故fib2中就是第4个月的兔子对数。可以看出此时fib1和fib2均为最近两个月的兔子对数循环推出下两个月的兔子对数。改进后的程序如下
%%time
# 兔子产子问题if __name____main__:fib1 1fib2 1i 1while i 15: #每次求两个因此循环变量循环到15print(%8d %8d %(fib1, fib2), end )if i % 2 0:print()fib1 fib1 fib2 # 最新一个月的兔子对数fib2 fib1 fib2 # 第4个月的兔子对数i 1 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 CPU times: user 294 µs, sys: 0 ns, total: 294 µs
Wall time: 290 µs