全局变量和Python中的递归

2024-03-28 19:37:27 发布

您现在位置: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']

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

另外,如果有一种方法可以在没有任何变量的情况下做到这一点,我也想学习一下。在


Tags: or函数字符串代码stringlenreturnif
3条回答

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

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循环变量i和{},但这将是一个神秘的,不太可读。在

相关问题 更多 >