2013-02-21 67 views
0

這個功能,我從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 

有人可以告訴我發生了什麼事嗎?我的代碼有什麼問題,我將如何解決它?謝謝!

+3

我有一種感覺,它是關於括號 – Raufio 2013-02-21 00:44:08

+2

真的沒有理由把它寫成一個巨大的表達。你只是在尋找「我在這裏弄錯了什麼?」或者「我怎樣才能以一種足夠可讀的方式來組織它,以便我自己調試?」 – abarnert 2013-02-21 00:47:33

回答

2

我想你的意思

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

1

如果你無法理解自己的代碼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)) 
相關問題