Pyhton 兔子繁衍问题(后有递归求法)(设有一对新生的兔子从第4个月开始他们每个月月初都生一对新兔子, 新生的兔子从第4个月开始又每个月月初生一对兔子,求n个月后兔子的总对数)

设有一对新生的兔子从第3个月开始他们每个月月初都生一对新兔子,
新生的兔子从第3个月开始又每个月月初生一对兔子,
求n个月后兔子的总对数
这个和求第n个斐波那契数有着异曲同工之妙
为什么n要-1

  • 我们假设初始的这一对兔子是0个月
  • 过1个月长1个月,长了2个月后,第3个月月初,它才2个月吧,就可以生兔子了
  • 新生的一对兔子是月初出生的,所以过完那个月就一个月大了,再过1个月就可以生兔子了
  • 所以初始化的时候是没有一个月的兔子的,需要过一个月才有,所以我们就减少一次循环
    注意我这也只是推理,并没有去根据规律去做
def f(n):
    # 一个月的兔子
    a = 1
    # 二个月的兔子
    b = 0
    # 成年兔
    c = 0
    for i in range(n-1):
        # 过一个月新生的兔子数目应该等于上个月成年兔子的数目加上2个月大的兔子的数目
        # 注意刚生出来是月初,过完这个月就1个月大了,所以新生兔子就可以直接理解成是1个月大的兔子
        a,b,c = b+c,a,b+c
    print(a+b+c)

f(1)# 1
f(2)# 1
f(3)# 2
f(4)# 3
f(5)# 5
f(6)# 8
f(7)# 13
f(10)# 55

# 函数递归
def f1(n):
    if n in [1,2]:
        return 1
    return f1(n-1)+f1(n-2)

print(f1(1),f1(2),f1(3),f1(4),f1(5),f1(6),f1(7),f1(8),f1(9),f1(10))
# 1 1 2 3 5 8 13 21 34 55

设有一对新生的兔子从第4个月开始他们每个月月初都生一对新兔子,
新生的兔子从第4个月开始又每个月月初生一对兔子
思路差不多

def fn(n):
    # 第一个月
    a = 1
    # 第二个月
    b = 0
    # 第三个月
    c = 0
    # 成年
    d = 0
    for i in range(n-1):
        a,b,c,d = c+d,a,b,c+d
    print(sum((a,b,c,d)))

fn(1)# 1
fn(2)# 1
fn(3)# 1
fn(4)# 2
fn(5)# 3
fn(6)# 4
fn(7)# 6
fn(8)# 9
fn(9)# 13
fn(10)# 19

# 我们从这也能发现规律,从第4个数字开始,它等于前第1数字加上前第3个数字的和
# 递归
def fn1(n):
    if n in range(1,4):# 注意含头不含尾
        return 1
    return fn1(n-1) + fn1(n-3)

print(fn1(1),fn1(2),fn1(3),fn1(4),fn1(5),fn1(6),fn1(7),fn1(8),fn1(9),fn1(10))
# 1 1 1 2 3 4 6 9 13 19

5个月出生、6个月出生也可以去推一推
我不知清楚我这样的推理对不对,因为这个东西也困扰了我很久,希望对大家有所帮助,大家要是有什么不同的见解,可以分享分享,或是我哪里的思路有不对的,还望指出!!十分感谢

仅代表个人理解
最后不要不要忘记点赞支持一下哦QAQ

猜你喜欢

转载自blog.csdn.net/hmh4640219/article/details/112977312