繁体   English   中英

python中的全局变量和递归

[英]Global variables and recursion in 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']

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

另外,如果有一种方法可以做到完全没有任何变量,我也想学习。

如果不想向该函数添加任何参数,则可以在其中包含第二个函数:

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

这样的选择吗?

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

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

没有递归和全局变量的相同函数:

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 ,但这将是不明确的,而且不太可读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM