自然数の分割
Posted feedbacks - Python
ありがちな再帰で。
1 2 3 4 5 6 7 8 | def f(n, m):
f0 = lambda n, m: [[i] + a for i in range(n, -1, -1) for a in f0(n-i, m-1)] if m > 1 else [[n]]
for a in f0(n, m):
for i in a:
print '%d,' % i,
print
f(5, 3)
|
Python で素直に書くとこうですかね。 ところで、n >= m の条件って必要ないことないですか?n, m が整数なら n >= 0, m > 0 で十分なような。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import sys
def sum_perms(n, m):
if m == 1:
yield (n, )
else:
for i in reversed(xrange(n + 1)):
for tail in sum_perms(n - i, m - 1):
yield (i,) + tail
def main(args):
if len(args) == 2:
n, m = map(int, args)
else:
n, m = 5, 3
for t in sum_perms(n, m):
print t
if __name__ == '__main__':
main(sys.argv[1:])
|


herumi
#4099()
Rating1/1=1.00
[ reply ]