这里写自定义目录标题
题目描述:
有M个(数量100个以内)箱子,每个箱子里面装有若干玩具球,已知第1个箱子玩具球的个数比第2个多2个,第2个箱子比第三个箱子多3个,第3个箱子比第4个多7个,第4个箱子比第5个多25个,,第5个箱子比第6个多121个,以此列推,已知最后一个箱子有K个玩具球,请采用递归算法计算所有M个箱子的玩具球总数。
解题思路:假设有10个盒子,最后一个盒子的数量为1,由于采用递归算法,可以用递归计算出每两个盒子之间的数量差值,
数量差值思路有两个理解方式,验证后都对,
思路一:
从差值数2 3 7 25 121 …和盒子的序号可以看出,假定目前的前一个盒子索引号为i(i从1开始)后一个盒子的索引为i+1,差值为i的阶乘再加1,从此就可非递归计算出差值序列。
m, k= 10, 1
import math
cha1 = []
def get(i):
for i in range(1,m):
cha1.append(math.factorial(i)+1)
思路二
也是结合盒子序号看,画10个盒子描述很明显,这种是用递归求差值序列
cha2 = []
Box = []
def get2(i):
if i == 1:
cha2.append(2)
return 2
else:
tmp = get2(i-1)
res = tmp*(i-1) + tmp-(i-1)
cha2.append(res)
# print([cha2[j] for j in range(len(cha2))])
return res
get2(9)
注意坑来了:
差值序列要从后往前加,得到的才是每个盒子的玩具球数量Box[],最后还要对Box[]内所有元素进行一次总和。
Box.append(k)
for i in range(m-1,0,-1):
Box.append(Box[m-i-1] + cha2[i - 1])
print(sum(Box))