zoukankan      html  css  js  c++  java
  • python算法(2)兔子产子(斐波那切数列)

    兔子产子

    1.问题描述

    有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总对数为多少?
     

    2.问题分析

    兔子产子问题是一个有趣的古典数学问题,我们画一张表来找下兔子数的规律,如下表所示

    月数 小兔子对数 中兔子对数 老兔子对数 兔子总对数
    1 1 0 0 1
    2 0 1 0 1
    3 1 0 1 2
    4 1 1 1 3
    5 2 1 2 5
    6 3 2 3 8
    7 5 3 5 13

    说明:不满1个月的兔子为小兔子,满1个月不满2个月的为中兔子,满3个月以上的为老兔子。

    可以看出,每个月的兔子总数依次为1,1,2,3,5,8,13...这就是Fibonacci数列。总结数列规律即为从前两个月的兔子对数可以推出第3个月的兔子对数
     

    3.算法设计

    本题目是典型的迭代循环,即是个不断用新值取代变量的旧值,然后由变量旧值递推出变量新值的过程。这种选代与这些因素有关:初值迭代公式选代次数。经过问题分析,算法可以描述为
    fibn-1 = fiibn-1 = 1(n<3) 初值
    fibn = fibn-1 + fibn-2(n≥3) 迭代公式
     
    Python 语言來描述迭代公式即为fib=fibl+fib2,其中fib为当前新求出的免子对数,fibl 为前一个月的兔子对数,fib2为前两个月的免子对数,然后为下一次选代做准备,fib②给fib1①给fib2,进行如下的赋值 fib2=fib1, fibl=fib,要注意赋值的次序;选代次数由循环变量控制,为所求的月数。
     

    4.完整程序

    if __name__=="__main__":
        fib1 = 1
        fib2 = 1
        i = 1
        while i <= 15:  #每次求两个,因此循环变量循环到15
            print("%8d    %8d" %(fib1, fib2), end="      ")
            if i % 2 == 0:
                print()
            fib1 = fib1 + fib2  # 最新一个月的兔子数
            fib2 = fib1 + fib2  # 第4个月的兔子数
            i += 1
    
  • 相关阅读:
    Linux 题库面试题(一)中级
    Linux 题库面试题(一)初级
    题库性能面试题
    数据库面试题(一)子查询及面试题练习
    接口分类(http接口、api接口、RPC接口、RMI、webservice、Restful等概念)
    postman 基本操作
    Monkey APP压力稳定性测试
    Charles 功能介绍说明和使用教程
    在线绘图工具
    tcpdump
  • 原文地址:https://www.cnblogs.com/jiakecong/p/15100809.html
Copyright © 2011-2022 走看看