我需要做一个像这样工作的递归函数:
输入:'word'
输出:['word','ord','rd','d']
现在,最好的方法就是这样:
func(string):
if not string:
return []
return [string] + func(string[1:])
但我想这样做:
func(string, recursivelist):
if len(string) == 0:
return []
recursivelist += [string]
recursivelist += func(string[1:],recursivelist)
return recursivelist
我知道这是一个做递归函数的坏方法,我正在慢慢尝试第一种方法,但出于好奇,为什么这段代码无效?
输出如下:
['word','ord','rd','d','word','ord','rd','d','word','ord','rd','d ','word','ord','rd','d','word','ord','rd','d','word','ord','rd','d', 'word','ord','rd','d','word','ord','rd','d']
答案 0 :(得分:0)
每个递归调用都会获得相同的列表,而不是它的副本。因此,您不需要添加递归调用的返回值,因为它们都修改了相同的列表。这足以:
def func(string, recursivelist):
recursivelist.append(string)
func(string[1:], recursivelist)
return recursivelist
答案 1 :(得分:-2)
不使用递归的简单解决方案:
def func(word):
for i in xrange(len(word)):
yield word[i:]
>>> list(func("word"))
['word', 'ord', 'rd', 'd']
或者如果您不想使用' yield':
def func(word):
return [ word[i:] for i in xrange(len(word)) ]