2017-01-03 19 views
-1

當我處理Ackermann function爲什麼參數類型由不同的比較運算符改變?

def ackermann(m,n): 
    if m == 0: 
    return n + 1 
    if m > 0 and n == 0: 
    return ackermann(m-1,1) 
    elif m > 0 and n > 0: 
     return ackermann(m-1,ackermann(m,n-1)) 

我寫錯運營商在第二if聲明:

if m == 0 and n == 0: 
    return ackermann(m-1,1) 

但我得到了一個錯誤:

File "C:/Users/jacob/Desktop/think python/exercise 6-2.py", line 15, in ackermann 
return ackermann(m-1,ackermann(m,n-1)) 

File "C:/Users/jacob/Desktop/think python/exercise 6-2.py", line 14, in ackermann 
elif int(m) > 0 and int(n) > 0: 

TypeError: unorderable types: NoneType() > int() 

爲什麼參數類型的改變運營商?

+2

您包含的代碼與此錯誤消息不符。你如何調用你的功能? – jtbandes

+0

你見過這個:http://www.greenteapress.com/thinkpython/code/ackermann.py –

+0

可能你沒有覆蓋所有的條件,並且函數在你的遞歸中隱式地返回一個None。 – DaveQ

回答

1

行,從而產生錯誤的代碼是通過一個例子

def ackermann(m,n): 
    if m == 0: 
    return n + 1 
    if m == 0 and n == 0: 
    return ackermann(m-1,1) 
    elif m > 0 and n > 0: 
     return ackermann(m-1,ackermann(m,n-1)) 

讓我們步驟。

ackermann(2, 1) 
    # m = 2, n = 1 
    m == 0: False 
    m == 0 and n == 0: False 
    m > 0 and n > 0: True 
    return ackermann(m-1,ackermann(m,n-1)) 
    ackermann(m,n-1) # the inner call 
    ackermann(2,1-1) 
     # m = 2, n = 0 
     m == 0: False 
     m == 0 and n == 0: False 
     m > 0 and n > 0: False 
     # None of the conditions matched, so we (implicitly) return None 
     # because we didn't execute an explicit return 
    ackermann(2-1,None) # the outer call 
     # m = 1, n = None 
     m == 0: False 
     m == 0 and n == 0: False 
     m > 0 and n > 0: 
     m > 0: True # m == 1 
     n > 0: error! # n == None 
+0

非常感謝你!真的很棒你的答案! –

+0

答案中的'ackermann'函數與OP的不同 - 其中第二個「if」是「if m> 0和n == 0:」。 – martineau

+0

@martineau我從「*我在第二個循環函數中寫了錯誤的運算符',如果m == 0且n == 0:返回ackermann(m-1,1)'*」,我認爲這意味着OP使用了第二個if語句(「loop」)中的錯誤運算符('=='而不是'>'),這會在某種程度上導致類型錯誤消失,如果使用正確的Ackermann函數(第一個片段)。 – melpomene

0

我懷疑你沒有達到任何一個條件,並且會導致隱式返回值爲None的函數結束。

嘗試在函數結尾處返回一些有效值。

例如,

def ackermann(m,n): 
    if m == 0: 
    return n + 1 
    if m > 0 and n == 0: 
    return ackermann(m-1,1) 
    elif m > 0 and n > 0: 
     return ackermann(m-1,ackermann(m,n-1)) 

    # Writing an explicit return to make sure we always 
    # return some integer and not None. Change this accordingly 
    return 1 
+0

函數結束時返回_what_值? – martineau

+0

我的意思是寫一個明確的非None返回而不是隱式None返回。 –

相關問題