我正在处理一个递归函数,这是我第一次弄清楚如何停止计算。
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,因为除此之外没有其他选项。
编辑:
实际上,我想要告诉函数它不应该处理值为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 :(得分:0)
你必须确保它在n == 1时达到一个点...在你的情况下,如果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
答案 1 :(得分:0)
如果您希望它不使用参数0处理递归a,只需为其添加基本情况。我所做的是确保返回的值将在上面的修订级别中取消为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])