停止递归调用的函数
我想要在下面的这个循环中,一旦返回了值 (x,y)
或者 (z,2)
,就停止这个循环,这样 i
的值就不会继续增加,而是会在第一次满足 if
或 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
我不太明白这个问题。如果我理解得没错,你想要的事情其实已经发生了。如果你使用了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)
所以“停止”的条件必须是返回一个基本情况。这对递归来说是至关重要的。你不能随便中断。