暂停一个递归调用函数
问题描述:
我试图制止for循环低于一次值(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)
我该如何做到这一点?
答
正如我在评论中写道的:该函数根本不是递归函数。递归意味着函数调用它来完成它的目的。此调用可以是间接的,这意味着该函数使用助手函数,它将再次调用第一个函数。
但是你的代码并不包含这两种情况。
递归函数总是有一定的架构:
被称为要进行测试,如果原始的情况下(或选项中一个基本情况)已经到达后的第一件事。如果是这样,它会返回。
如果不是,它会计算出需要的任何结果并将结果再次传递给自己,直到达到原始大小写,并且嵌套函数调用将一个接一个完成。递归
一个众所周知的用法是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)
所以,“停止”必须是原始的案件的回报。这对于递归至关重要。你不能以某种方式爆发。
答
我不明白这个问题 - 如果我说得对,那你想要的就已经发生了。如果return
,该功能停止运行。
除了这个答案一些评论:
-
同时,我不能看到那里的函数被递归调用,也没有什么
exit if maxPalindrome is True
手段。 (这是一个评论,也许?)
此外,
maxcomplist[:]==theList[:]
对我来说没有多大意义,似乎是浪费时间和记忆,并且在每个迭代循环中进行这种比较不会使它也更快。
而不是试图找出如何“停止”递归执行,我可能会建议你检查[recursion]上的Wikipedia页面(http://en.wikipedia.org/wiki/Recursion)。更具体地说,阅读**基本案例**,因为这是你如何停止递归执行。 –
不是一个答案,但是当你开始的时候,一些递归函数可能很难让你头脑发热。考虑拿起一本像Little Schemer这样的书(http://www.ccs.neu.edu/home/matthias/BTLS/),教会你如何以更适合递归的方式分解问题。 –
这看起来不像递归函数。它不会在任何地方称它为自己。 – vikingosegundo