如何停止递归函数?

时间:2016-04-24 09:22:50

标签: python function recursion

我正在处理一个递归函数,这是我第一次弄清楚如何停止计算。

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])

2 个答案:

答案 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])
相关问题