【HJ37 统计每个月兔子的总数】

描述
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
数据范围:输入满足 1≤n≤31 
输入描述:
输入一个int型整数表示第n个月

输出描述:
输出对应的兔子总数

示例1
输入:
3
复制
输出:
2
 

思路一:找找规律,发现符合斐波那契数列,所以可以使用递归

while True:

    try:

        m = int(input())

        def count_rabit(m):

            if m <= 2:

                return 1

            if m > 2:

                return count_rabit(m - 1) + count_rabit(m - 2)

        print(count_rabit(m))

    except:

        break

思路二:思路很重要,思维越抽象,代码越简单

我们可以假设num,num1,num2初始值为0,针对第n月的情况,我们可以使用for循环处理,在循环中,需要特别处理前两个月的情况,因为这两个月,没有成年的兔子可以生育,当到达第三个月以及以后时,我们可以按照正常的逻辑进行处理。

首先,我们先讨论特例的情况。当n=1时,此时三种兔子都是0,加入第一只小兔子,设num1=1;当n=2时,没有成年的兔子可以生产,此时有一只兔子的年龄增加一岁。

当n>=3时,此时,已有可以生产的成年兔子了,num2增加一月,此时成年兔子为num=num+num2,而num1中的兔子年龄增加一月,num2=num1。当月新出生的兔子num1=num。

while True:
    try:
        n = int(input())
        num = 0
        num1 = 0
        num2 = 0
        for i in range(n):
            num += num2
            num2 = num1
            if num==0 and num2 == 0:
                num1 = 1
            elif num==0 and num2 == 1:
                num1 = 0
            else:
                num1 = num 
        print(num+num1+num2)
        
    except:
        break

进一步优化:

a表示出生不低于两个月的兔子数量,b表示出生一个月的兔子数量,c表示刚出生的兔子数量,可知:每过一个月就有:

a = a + b

b = c

c = a

总数为a+b+c

n = int(input())

a = 1    # 出生不短于两个月的兔子
b = 0    # 出生一个月的兔子
c = 0    # 刚出生的兔子
for i in range(3, n+1):
    a += b
    b = c    
    c = a

print(a+b+c)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值