2016-09-20 11 views
-1

こんにちは私のpythonに新しいですし、テーブルをいっぱいに再帰関数を実装しようとしているが、プログラムによって実行されているとき、私は次の例外に再帰if文のpython

サポートされていないオペランドのタイプ(複数可)を取得するための+: 'NoneType'と 'int'です。

def cost(i, j): 
    if table[i][j] == None: 
     v1 = v2 = v3 = v4 = None 
     if i > 0 and j > 0: 
      print "case1" 
      v1 = cost(i-1, j-1) + getSubCostMatrixValue(options[string1[i]], options[string2[j]]) 
     if i > 0 and j >= 0: 
      print "case2" 
      v2 = cost(i-1, j) + gapCost 
     if i >= 0 and j > 0: 
      print "case3" 
      v3 = cost(i, j-1) + gapCost 
     if i == 0 and j == 0: 
      print "case4" 
      v4 = 0 
     print "Max:" 
     print max(v1,v2,v3,v4) 
     table[i][j] = max(v1,v2,v3,v4) 
     return table[i][j] 

再帰呼び出しが何らかの形で失敗したかのような問題は、私ケース2とケース3をocours、しかし、私は理由を見つけることができません。

テーブルが「なし」で始まり、gabCostがintであると、getSubCostMatrixValueもintを返します。

+0

あなたのインデントを修正し、 'gapCost'は何ですか? 'max()'はどのように書かれていますか? – depperm

+1

あなたはあなたのブランチの何物かを*返すわけではありません。 'return v1' ...' return v2'などと同じです。 –

+0

'None'の正しいテストは' 'table [i] [j]がNoneの場合' 'です。これは、 '=='が予期しない評価を0またはFalseにする可能性があるためです。私はそれがあなたの問題の原因だとは思わない。 – cdarke

答えて

0

明らかに、cost()関数はNoneを返すことがあります。私が正しく理解するならば、これはiまたはjが否定的である場合にのみ起こります。これはケース2または3でのみ発生するので、あなたのiまたはjは実際には0より大きく、1より小さいフロートです。あなたのプログラムについてもっと詳しく説明したら、誰かがもっと詳細な答えを持っているかもしれません!