停止递归调用的函数

-1 投票
2 回答
2918 浏览
提问于 2025-04-17 04:51

我想要在下面的这个循环中,一旦返回了值 (x,y) 或者 (z,2),就停止这个循环,这样 i 的值就不会继续增加,而是会在第一次满足 ifelif 条件时就停止。

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

我不太明白这个问题。如果我理解得没错,你想要的事情其实已经发生了。如果你使用了return,那么这个函数就会停止运行。

关于这个回答,还有一些补充说明:

  • 另外,我看不出这个函数在哪里被递归调用,也不明白

    exit if maxPalindrome is True
    

    是什么意思。(这可能是个注释吗?)

  • 此外,maxcomplist[:]==theList[:]对我来说没有太大意义,感觉是在浪费时间和内存,而且在每次循环中进行这样的比较也不会让速度变快。

1

我之前在评论里提到过:这个函数根本不是递归函数。
递归的意思是,一个函数会调用自己来完成它的任务。这种调用可以是间接的,也就是说,函数可以使用一个辅助函数,这个辅助函数会再次调用最初的函数。
但是你的代码并没有包含这两种情况。

递归函数总是有一个特定的结构:

  • 被调用后,首先要检查是否达到了基本情况(或者在选项中某个基本情况)。如果达到了,就返回。

  • 如果没有达到,它会计算所需的内容,并将结果再次传递给自己,直到达到基本情况,然后嵌套的函数调用会一个接一个地结束。

递归的一个著名应用是快速排序算法:

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)

所以“停止”的条件必须是返回一个基本情况。这对递归来说是至关重要的。你不能随便中断。

撰写回答