2014-12-07 162 views
0

在下面的代碼中,我試圖做一個遞歸函數來查找給定字符串的子字符串。python中的全局變量和遞歸

i = 0 
j = 0 
def substrings(string): 
    global i, j 
    if j == len(string) - 1 or len(string) == 0: 
     return [] 
    elif i == len(string): 
     j = j + 1 
     i = j + 1 
     return [string[j:i]] + substrings(string) 
    i += 1 
    return [string[j:i]] + substrings(string) 


>>> substrings('ceng') 
>>> ['c', 'ce', 'cen', 'ceng', 'e', 'en', 'eng', 'n', 'ng', 'g'] 

我總是傾向於在使用全局變量的同時使用遞歸,我不喜歡它。在這種情況下,有什麼我不能使用全局變量? 我知道我可以將變量作爲參數傳遞給函數,但它不適用於我,因爲該函數應該只有一個參數。

此外,如果有一種方法沒有任何變量,我也想學習。

+1

爲什麼不給子串添加另一個參數?你的陳述感到困惑「必須」 – Duniyadnd 2014-12-07 12:55:06

+0

@Diyiyadnd該函數應該只有一個參數,即字符串本身。這只是一個約束。 – user2694307 2014-12-07 12:58:22

回答

2

如果你不想添加任何參數的功能,你可以在它封裝的第二功能:

def substrings(string): 
    index= 0 
    length= len(string)+1 
    result= [] 

    def substrings(string, index): 
     if index==length: 
      return 

     for i in xrange(index+1, length): 
      result.append(string[index:i]) 
     substrings(string, index+1) 
    substrings(string, index) 

    return result 
+0

我們暫時還沒有使用任何迭代工具(比如for或while),但我的想法是我可以定義一個內部函數。謝謝。 – user2694307 2014-12-07 13:15:29

0

是這樣的一個選項?

def substrings(string, i=0, j=0): 
if j == len(string) - 1 or len(string) == 0: 
    return [] 
elif i == len(string): 
    j = j + 1 
    i = j + 1 
    return [string[j:i]] + substrings(string, i, j) 
i += 1 
return [string[j:i]] + substrings(string, i, j) 

>>> substrings("ceng") 
['c', 'ce', 'cen', 'ceng', 'e', 'en', 'eng', 'n', 'ng', 'g'] 

您不必提供參數,但可以。 ^^

+0

那些像可選參數?你絕對避免了全局變量,並且非常感謝你,但是我也想知道是否有辦法在沒有任何變量或參數的情況下執行此操作?列表切片的東西可能? – user2694307 2014-12-07 13:21:42

0

同樣的功能,且無需遞歸和全局變量:

def substrings(s): 
    return [s[i:j] for i in xrange(0, len(s)) 
      for j in xrange(i+1, len(s)+1)] 

遞歸你可能需要你的函數,它必須通過可選的參數傳遞的一些內部狀態。您絕對可以使用僅返回列表的長度來計算兩個for循環變量ij,但這樣做會很神祕而且不可讀。