2014-12-07 98 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,但这样做会很神秘而且不可读。