上周末公司组织去旅游,在路上一个同事提出了一个小问题,就是怎么找出三个数,使它们的和为13。后来又引申为如何找出m个数,使它们的和为n。下面是使用递归的方法来实现:
其中nBlock为个数,nTotal为总和,nBegin为所需要找的nBlock个数的数字的下限值。
基本思路:先确定第一个数为a,然后再找出nBlock-1个数使它们的和为nTotal-a.
import
sys
def test( nBlock, nTotal, nBegin = 1 ):
if nBlock <= 1 :
return [[nTotal]]
a = []
for i in range(nBegin, nTotal / nBlock + 1 ):
a.extend( [k + [i] for k in test(nBlock - 1 , nTotal - i, i)] )
return a
if __name__ == ' __main__ ' :
if len(sys.argv) == 3 :
print test(int(sys.argv[ 1 ]), int(sys.argv[ 2 ]))
def test( nBlock, nTotal, nBegin = 1 ):
if nBlock <= 1 :
return [[nTotal]]
a = []
for i in range(nBegin, nTotal / nBlock + 1 ):
a.extend( [k + [i] for k in test(nBlock - 1 , nTotal - i, i)] )
return a
if __name__ == ' __main__ ' :
if len(sys.argv) == 3 :
print test(int(sys.argv[ 1 ]), int(sys.argv[ 2 ]))
其中nBlock为个数,nTotal为总和,nBegin为所需要找的nBlock个数的数字的下限值。
基本思路:先确定第一个数为a,然后再找出nBlock-1个数使它们的和为nTotal-a.