我的递归程序遇到了一些问题,无法计算整数的整数分区数。
这是我写的:
def p(k, n):
if k > n:
return 0
if k == 1:
return 1
else:
return (p(k+1, n) + p(k, n-k))
def partitions(n):
ans = 1
for k in range(1, n/2):
ans += p(k, n-k)
return ans
此算法由维基百科的文章Partition (number theory)实施。这是我的程序输出的前几个整数:
partitions(0) = 1
partitions(1) = 1
partitions(2) = 1
partitions(3) = 1
partitions(4) = 2
partitions(5) = 2
partitions(6) = 2
partitions(7) = 2
我不确定为什么我的程序无法正常运行,因为我认为我正确地实现了来自维基百科的递归和算法。有人可以帮我理解它在做什么吗?
答案 0 :(得分:2)
你有一个基本案例错误:
if k == 1:
return 1
应该是
if k == n:
return 1
此外:
for k in range(1, n / 2):
应该是
for k in range(1, n / 2 + 1):
这是因为公式中的和是上界的包含,但在Python中,range
不包括上限。然后:
print [partitions(i) for i in range(1, 8)]
给出
[1, 2, 3, 5, 7, 11, 15]
匹配Wikipedia article中提供的值。
答案 1 :(得分:2)
我看到两个问题:
此:
if k == 1:
应为if k == n:
,此循环:
for k in range(1, n/2):
应该是range(1, n/2+1)
- 或更好,range(1, n//2+1)
明确我们想要整数除法的事实 - 因为Python中的range
不包括上限。修好后,我得到:
>>> [partitions(i) for i in range(1,10)]
[1, 2, 3, 5, 7, 11, 15, 22, 30]
(你会注意到,只有9个值。:^)