暂停递归调用的函数

时间:2011-10-23 21:50:47

标签: python recursion

我正在尝试在返回值(x,y)(z,2)之后停止下面的for循环,以便值i不会继续增加,并且只是在if时暂停{1}}或elif条件是第一个

def maxPalindrome(theList):
    # students need to put some logic here
    maxcomplist = theList[:]
    maxcomplist.reverse()
    control = len(theList) - 1
    # exit if maxPalindrome is True
    for i in range(control):
        if maxcomplist[:] == theList[:]:
            x = 0
            y = len(theList)
            return (x, y)
            break
        elif maxcomplist[i:control] == theList[i:control]:
            successList = theList[i:control]
            z = i
            w = len(theList) - z - 1
            return (z, w)

我该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

正如我在评论中写的那样:该功能根本不是递归的 递归意味着函数调用自身来完成它的目的。这个调用可以是间接的,这意味着该函数使用辅助函数,它将再次调用第一个函数 但是你的代码并没有涵盖这两种情况。

递归函数总是具有某种架构:

  • 被调用后的第一件事应该是测试,如果已达到原始情况(或选项中的一个原始情况)。如果是的话,它会返回。

  • 如果没有,它会计算所需的一切,并将此结果再次传递给自己, 直到达到原始情况,嵌套函数调用将一个接一个地完成。

递归的一个众所周知的用法是quicksort算法:

def quicksort(alist):
    if len(alist) < 2: 
        return alist # primitive case: a list of size one is ordered

    pivotelement = alist.pop()
    # compute the 2 lists for the next recursive call
    left  = [element for element in alist if element < pivotelement]#left = smaller than pivotelemet
    right = [element for element in alist if element >= pivotelement]#left = greater than pivotelemet

    # call function recursively
    return quicksort(left) + [pivotelement] + quicksort(right)

所以“停止”必须是原始案例的回归。这对于递归至关重要。你不能以某种方式爆发。

答案 1 :(得分:0)

我不明白这个问题 - 如果我做对了,那就是你想要的。如果您return,该功能将停止运行。

除了这个答案之外还有一些评论:

  • 同样,我无法看到递归调用函数的位置,也看不出

    exit if maxPalindrome is True
    

    装置。 (这可能是评论吗?)

  • 此外,maxcomplist[:]==theList[:]对我来说没有多大意义,似乎浪费时间和记忆,并且在每个迭代循环中进行这种比较并不会使它更快