设有一对新生的兔子从第3个月开始他们每个月月初都生一对新兔子,
新生的兔子从第3个月开始又每个月月初生一对兔子,
求n个月后兔子的总对数
这个和求第n个斐波那契数有着异曲同工之妙
为什么n要-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个月出生也可以去推一推
我不知清楚我这样的推理对不对,因为这个东西也困扰了我很久,希望对大家有所帮助,大家要是有什么不同的见解,可以分享分享,或是我哪里的思路有不对的,还望指出!!十分感谢