2017-01-03 10 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のものと同じではありません - 第2の" if "が' m> 0かつn == 0なら 'です。 – martineau

+0

@martineau m == 0、n == 0の場合、2番目のループ関数に誤った演算子を書きました:ackermann(m-1,1) '*"を返します。第2の 'if'文(" loop ")の誤った演算子(' = ''の代わりに '==')が返され、正しいAckermann関数(最初のスニペット)を使用すると消える型エラーが発生しました。 – melpomene

0

いずれかの条件に当てられず、暗黙のリターンを引き起こす関数の終わりに行くことはないと思われます。これはNoneです。

関数の最後に有効な値を返すようにしてください。

例えば、OK

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

私は暗黙の返り値ではなく、明示的な非 - なしの戻り値を書きます。 –

関連する問題