在下面的代码中,我试图创建一个递归函数来查找给定字符串的子字符串。
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']
我总是倾向于在使用递归时使用全局变量,而我根本不喜欢它。在这种情况下,有什么我不能使用全局变量? 我知道我可以将变量作为参数传递给函数,但它对我不起作用,因为函数应该只有一个参数。
另外,如果有一种方法可以完全没有任何变量,我也想了解它。
答案 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 i
和j
,但这将是神秘的,不太可读。