2011-10-23 70 views
-1

我試圖制止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

回答

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) 

所以,「停止」必須是原始的案件的回報。這對於遞歸至關重要。你不能以某種方式爆發。

0

我不明白這個問題 - 如果我說得對,那你想要的就已經發生了。如果return,該功能停止運行。

除了這個答案一些評論:

  • 同時,我不能看到那裏的函數被遞歸調用,也沒有什麼

    exit if maxPalindrome is True 
    

    手段。 (這是一個評論,也許?)

  • 此外,maxcomplist[:]==theList[:]對我來說沒有多大意義,似乎是浪費時間和記憶,並且在每個迭代循環中進行這種比較不會使它也更快。