【每日一题0619】计算松鼠的数量

题目:有两只小松鼠,从出生开始第3个月,每个月都会生一对小松鼠。小松鼠3个月后,也可以继续生,松鼠寿命是10个月。假设第一个月有一对刚出生的小松鼠,第n个月有多少松鼠?
请编写一个函数,接收一个数字n,返回第n个月的松鼠的总数。
来源:同事分享

def rib(n):
    if n <= 0:
        return 0
    elif n == 1 or n == 2:
        return 1
    else:
        if n < 10:
            return rib(n-1)+rib(n-2)
        else:
            return rib(n-1)+rib(n-2)-int((n/10))
i = int(input("输入月:"))
print(f"{i}月后小松鼠的数量为:{rib(i)}对")
"""
题目:有两只小松鼠,从出生开始第3个月,每个月都会生一对小松鼠。小松鼠3个月后,也可以继续生,松鼠寿命是10个月。假设第一个月有一对刚出生的小松鼠,第n个月有多少松鼠?
请编写一个函数,接收一个数字n,返回第n个月的松鼠的总数。
来源:同事分享
"""

def test(n):
    def handle(rib_list):
        i = 0
        while i < len(rib_list):
            if rib_list[i] > 10:  # 大于10死亡,按照这个月不生育来计算,如果第10个月生育后死亡就不是这么算了
                rib_list.pop(i)
                continue
            elif rib_list[i] >= 3:  # 大于3新增,年限增长
                rib_list.append(1)
                rib_list[i] += 1
            else:  # 小于3年限增长
                rib_list[i] += 1
            i += 1
        return rib_list

    start = [1, 1]
    result = start
    while n > 0:
        result = handle(start)
        n -= 1
    return len(result)


for h in range(1, 19):
    print(str(h) + ": " + str(test(h) / 2))


"""
题目:有两只小松鼠,从出生开始第3个月,每个月都会生一对小松鼠。小松鼠3个月后,也可以继续生,松鼠寿命是10个月。假设第一个月有一对刚出生的小松鼠,第n个月有多少松鼠?
请编写一个函数,接收一个数字n,返回第n个月的松鼠的总数。
来源:同事分享
"""


def test(n):
    def add_list(rib_list, s_start, s_end):
        r = 0
        for i in range(s_start, s_end):
            r += rib_list[i]
        return r

    def handle(rib_list):
        i = len(rib_list)
        while i >= 2:  # 年限增长1
            rib_list[i - 1] = rib_list[i - 2]
            i -= 1
        born = add_list(rib_list, 2, 10)  # 从第3-10年开始每个松鼠都生一个
        rib_list[0] = born
        return rib_list

    start = [0 for i in range(10)]
    start[0] = 2
    result = start
    while n > 1:
        result = handle(start)
        n -= 1
    return add_list(result, 0, 10)


for h in range( 19):
    print(str(h) + ": " + str(test(h) / 2))

只记录1-10年的松鼠,优化计数

可能理解的有问题,计算成 成长3个月,到第4个月才产仔了

def solution(n:int) -> int:
    ss_duple = {"a":{"lifetime":0,"is_dead":False}}
    for month in range(n):
        key_arr = ss_duple.copy()
        for ss_key in key_arr.keys():
            ss = ss_duple[ss_key]
            if ss["is_dead"] == True: continue
            else:
                ss["lifetime"] += 1
                #死亡
                if ss["lifetime"] == 10: ss["is_dead"] = True

            #产仔
            if ss["lifetime"] >3:
                new_key = ss_key+str(month+1)
                ss_duple[new_key] = {"lifetime":1,"is_dead":False}
        # print(ss_duple)

    all_num = 0
    live_num = 0
    for ss_key in ss_duple.keys():
        all_num +=1
        if ss_duple[ss_key]["is_dead"] == False: live_num +=1
    print("总共有%d松鼠,活着的有%d松鼠" % (all_num*2, live_num*2))
    return live_num*2