暂停一个递归调用函数

问题描述:

我试图制止for循环低于一次值(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) 

我该如何做到这一点?

+3

而不是试图找出如何“停止”递归执行,我可能会建议你检查[recursion]上的Wikipedia页面(http://en.wikipedia.org/wiki/Recursion)。更具体地说,阅读**基本案例**,因为这是你如何停止递归执行。 –

+1

不是一个答案,但是当你开始的时候,一些递归函数可能很难让你头脑发热。考虑拿起一本像Little Schemer这样的书(http://www.ccs.neu.edu/home/matthias/BTLS/),教会你如何以更适合递归的方式分解问题。 –

+2

这看起来不像递归函数。它不会在任何地方称它为自己。 – vikingosegundo

正如我在评论中写道的:该函数根本不是递归函数。递归意味着函数调用它来完成它的目的。此调用可以是间接的,这意味着该函数使用助手函数,它将再次调用第一个函数。
但是你的代码并不包含这两种情况。

递归函数总是有一定的架构:

  • 被称为要进行测试,如果原始的情况下(或选项中一个基本情况)已经到达后的第一件事。如果是这样,它会返回。

  • 如果不是,它会计算出需要的任何结果并将结果再次传递给自己,直到达到原始大小写,并且嵌套函数调用将一个接一个完成。递归

一个众所周知的用法是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[:]对我来说没有多大意义,似乎是浪费时间和记忆,并且在每个迭代循环中进行这种比较不会使它也更快。