python中的全局变量和递归

时间:2014-12-07 12:53:08

标签: python python-2.7 recursion global-variables

在下面的代码中,我试图创建一个递归函数来查找给定字符串的子字符串。

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']

我总是倾向于在使用递归时使用全局变量,而我根本不喜欢它。在这种情况下,有什么我不能使用全局变量? 我知道我可以将变量作为参数传递给函数,但它对我不起作用,因为函数应该只有一个参数。

另外,如果有一种方法可以完全没有任何变量,我也想了解它。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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']

您不必提供参数,但您可以。 ^^

答案 2 :(得分: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-loop-variables ij,但这将是神秘的,不太可读。