|
发表于 2018-10-16 15:22:07
|
显示全部楼层
本帖最后由 喜欢吃菠菜 于 2018-10-16 15:40 编辑
def divtocols(num,col,tmp,index,res):
"""
参数说明:num是要分解的整数,col要分解成的列数,比如5分成[1,4][2,3]就是2列,临时列表tmp格式:[]*col,res要返回的结果
思路:分解一个数最终就是化解成一个数分成2个整数,
比如5要分成3列数,先分[1,4][2,3]...,再剥第二列4,3分成两列[1,[1,3]],[1,[2,2]],[2,[1,2]],以此类推
"""
if num==1 or col==1:
res.append(num)
return
if num==col:
res.extend([1]*col)
return
if col==2:
for i in range(1,num//col+1):
tmp[-2],tmp[-1]=i,num-i
#print(tmp)
res.append(tmp[:])
for i in range(1,num//col+1):
if col<=2:break
tmp[index]=i
divtocols(num-i,col-1,tmp,index+1,res) #不能用递归返回 return 很重要,否则 for语句将不执行
#----------------------------------------------------------
def splitnum(num):
res=[]
for col in range(1,num+1):
arr=[]
tmp=[0]*col
divtocols(num,col,tmp,0,arr)
res.append(arr[:])
return res
res=splitnum(6)
for l in res:
print(l)
结果:
[6]
[[1, 5], [2, 4], [3, 3]]
[[1, 1, 4], [1, 2, 3], [2, 1, 3], [2, 2, 2]]
[[1, 1, 1, 3], [1, 1, 2, 2]]
[[1, 1, 1, 1, 2]]
[1, 1, 1, 1, 1, 1]
#分解的问题解决了,剩下的计算乘积等问题,就不是问题了。 |
|