2016-09-18 103 views
2

我试图编写一个Python函数来接收一个字符串和一个数字并返回一个包含字符串重复的列表。例如Python递归变量状态

print func(3, 'aaa') 

回报

['aaa', 'aaa', 'aaa'] 

这是我迄今所做的:

def func(times, data): 
    if times > 0: 
     return data.split() + func(times-1, data) 

但是,它给了我一个类型错误:

can only concatenate list (not "NoneType") to list. 

我我仍然是一个新手,我刚刚读了关于recu rsion。

我也想知道如何从连续的函数调用中“继承”变量的状态,而不必定义全局变量。请帮助!

+3

那么,什么时候'次发生== 0'?在这种情况下你没有返回任何东西。 –

+1

虽然这可以通过递归来完成,但是这个问题似乎很简单,没有它 –

+2

'['aaa'] * 3' –

回答

5

你需要一个基础情况下的时间为0时,你可以返回一个空列表:

def func(times, data): 
    if times == 0: 
     return [] 
    # no need for split, just wrap data in a list. 
    return [data] + func(times-1, data) 

在你的代码时,次== 0,你的函数返回隐无,所以你尝试添加递归调用None的结果。我们还应该使用< =在基本情况下赶上负输入时间:

def func(times, data): 
    if times <= 0: 
     return [] 
    return [data] + func(times-1, data) 

如果我们没有,我们将无限递归并触及RuntimeError: maximum recursion depth exceeded,因为我们永远不会打到基本情况。

有一个不错的在线工具python tutor,可以可视化的步骤,所以你可以看到究竟发生了什么,这将突出显示为什么和你的代码erros的地方。

当你有,你可以使用rcviz工作解决方案,这将创造的执行步骤,一个漂亮的PNG:

enter image description here

注:1,边缘通过在他们的顺序编号遍历执行。 2.边缘从黑色变为灰色,表示遍历顺序:先黑边,后边灰边

0

虽然@Padraic坎宁安有一个很好的答案,这里是一个简单的方法来做到这一点:

def func(number, content): 
    return [content] * number 

或列表理解:

def func(number, content): 
    return [content for _ in range(number)]