2016-04-24 9 views
1

私は再帰関数に取り組んでいます。計算を止める方法がわからないのは初めてです。再帰関数を停止する方法はありますか?

val = [[12, 11, 3, 38], [13, 18, 49, 41], [12, 17, 33, 45], [45, 36, 32, 33]] 

def rec(n, o1, o2, o3, o4): 
    if n==1: # BECAUSE IN CASE THAT N==1, THERE IS JUST ONE ARGUMENT WITH VALUE 1, OTHER ARGUMENTS SHOULD HAVE VALUE 0 
     if o1==1: 
      return val[0][0] 
     elif o2==1: 
      return val[0][1] 
     elif o3==1: 
      return val[0][2] 
     else: 
      return val[0][3] 

    return max(rec(n - 1, o1 - 1, o2, o3, o4) + val[n][0], 
       rec(n - 1, o1, o2 - 1, o3, o4) + val[n][1], 
       rec(n - 1, o1, o2, o3 - 1, o4) + val[n][2], 
       rec(n - 1, o1, o2, o3, o4 - 1) + val[n][3]) 

4つの穴に最適な分布を計算する必要があります。したがって、各穴に最大値の合計があります。 valリストはこの告げる:val [0]穴のために、私は価格val[0][0]とそこに第一の項目を置くことができるなど

を問題が禁止されている数回の反復負の数字の後に持ってo値ということです。

たとえば、rec(1,0,0,50,0)は、これ以外のオプションがないため、50にする必要があります。

EDITは:0

のでrec(2,0,1,0,1)あなたはそれが到達したことを確認する必要がありmax(rec(1,0,0,0,1)+val[2][1], rec(1,0,1,0,0) + val[2][3])

+0

する上記のリビジョンレベルで相殺だろう戻ってくださいました。 nが1でなければ、私はrec(n-1 ...)を呼び出すので、それは各反復で減少するはずです。 –

+0

はい、でもそれは1に等しいとは限りません--->そのテストを 'n <1'に変更して –

+0

と表示することは問題ではありません。 –

答えて

0

引数が0の再帰を処理しないようにするには、そのための基本ケースを追加します。私がやったことは価値が、私は取得しないものだ0

def rec(n, o1, o2, o3, o4): 
    if o1 <= 0: 
     return -val[n+1 if n<len(val)-1 else n][0] 
     # checks for out of bounds with inline if, 
     # return negative value so compared value in upper level will be 0, 
     # and it will never be chosen 
    if o2 <= 0: 
     return -val[n+1 if n<len(val)-1 else n][1] 
    if o3 <= 0: 
     return -val[n+1 if n<len(val)-1 else n][2] 
    if o4 <= 0: 
     return -val[n+1 if n<len(val)-1 else n][3] 
    if n<=1: # like Reblochon said, n might be float if you are unlucky 
     if o1==1: 
      return val[0][0] 
     elif o2==1: 
      return val[0][1] 
     elif o3==1: 
      return val[0][2] 
     else: 
      return val[0][3] 

    return max(rec(n - 1, o1 - 1, o2, o3, o4) + val[n][0], \ # you will need these for line continuations 
      rec(n - 1, o1, o2 - 1, o3, o4) + val[n][1], \ 
      rec(n - 1, o1, o2, o3 - 1, o4) + val[n][2], \ 
      rec(n - 1, o1, o2, o3, o4 - 1) + val[n][3]) 
0

を返す必要があります

実際に

、私が欲しいのは、それが値で引数を処理しないでください機能を伝えることですここであなたの場合、nが浮動小数点の場合、絶対に起こらないかもしれませんが、abs(n-1)<小イプシロンをテストする必要があります...

また、それは可能性がありますこの場合、最良の解決方法になるように、n == 1テストをn < 1に変更することができます。

val = [[12, 11, 3, 38], [13, 18, 49, 41], [12, 17, 33, 45], [45, 36, 32, 33]] 

def rec(n, o1, o2, o3, o4): 
    if n < 1: 
     if o1 == 1: 
      return val[0][0] 
     elif o2 == 1: 
      return val[0][1] 
     elif o3 == 1: 
      return val[0][2] 
     else: 
      return val[0][3] 

    return max(rec(n - 1, o1 - 1, o2, o3, o4) + val[n][0], 
       rec(n - 1, o1, o2 - 1, o3, o4) + val[n][1], 
       rec(n - 1, o1, o2, o3 - 1, o4) + val[n][2], 
       rec(n - 1, o1, o2, o3, o4 - 1) + val[n][3]) 

rec(3, 2, 2, 2, 2) 

>>> 164 
+0

o1-o4引数は最初は等しいです。そして不変は、n = sum(o1、o2、o3、o4)です。 –

+0

はい、それはあなたの継続的に追加された条件でも動作します...あなたは再帰を止めたかったのです...今はそうです! –

関連する問題