递归函数来了:“类型错误:‘诠释’对象不是可迭代”
问题描述:
这个功能,我从this question了,如下:递归函数来了:“类型错误:‘诠释’对象不是可迭代”
def f(n, p, k, t):
return sum(sum(1 if n == 3 else
(0 if k == 1 else
(1/36) * f(n-1, p, k-1, t-(max(p,i)))
for i in xrange(1, 7)))
for p in xrange(1, 7))
print sum(f(5,j,3,15) for j in xrange(1, 7))
当我运行它,我得到这个长回溯错误序列结束于:
File "C:/Users/r/Documents/school/IB/Computer Science HL/Other Languages/Problem240/Problem240 - recursive2.py", line 6, in <genexpr>
for p in xrange(1, 7))
TypeError: 'int' object is not iterable
有人可以告诉我发生了什么事吗?我的代码有什么问题,我将如何解决它?谢谢!
答
我想你的意思
def f(n, p, k, t):
return sum(sum(1 if n == 3 else
(0 if k == 1 else
(1/36) * f(n-1, p, k-1, t-(max(p,i)))) # <- more here
for i in range(1, 7)) # <- less here
for p in range(1, 7))
print(sum(f(5,j,3,15) for j in range(1, 7)))
(我使用Python 3中,但它基本上是相同的)。
你有一些parens错误,所以内在的总和不是像你期望的发电机表达式。
见下文,因为你使用Python 2
+0
谢谢。我知道这是括号中的问题。我只是把多余的一个放在错误的地方。 :D – 2013-02-21 00:53:55
+3
'(1.0/36)'为Python2强制浮动划分 – 2013-02-21 01:01:21
答
如果你无法理解自己的代码gnibbler的点,把它分解成更小的部分
def f(n, p, k, t):
ternary = (1 if n == 3 else 0 if k == 1 else
f(n-1, p, k-1, t-max(p,i))/36.0 for i in range(1, 7))
inner_sum = sum(ternary)
return sum(inner_sum for p in range(1, 7))
我有一种感觉,它是关于括号 – Raufio 2013-02-21 00:44:08
真的没有理由把它写成一个巨大的表达。你只是在寻找“我在这里弄错了什么?”或者“我怎样才能以一种足够可读的方式来组织它,以便我自己调试?” – abarnert 2013-02-21 00:47:33