2017-02-22 135 views
1

我想递归地追加到列表中,但是我不能想出一个可以工作的函数。该函数有两个参数timesdatatimes应该是追加数据的次数。追加列表中的Python递归

这是到目前为止我的代码:

def replicate_recur(times, data): 
    result2 = [] 
    if times == 0: 
     result2.append(data) 
    else: 
     result2.append(data) 
     replicate_recur(times - 1, data) 
    return result2 
+0

RESULT2是地方,你在这儿就不得不提到result2.extend(replicate_recur(倍 - 1,数据)) – Kajal

+0

你可以简单地通过使用result.extend(data * times)来实现这个 – Kajal

+0

我得到了使用递归的指令 – Nix

回答

1

您可以使用xrange这一点,没有一点使用递归除非它是一个编码测试。

def replicate(times, data): 
    result2 = [] 
    for i in xrange(times): 
     result2.append(data) 
    return result2 

同样的功能可以写在一个递归的方式是这样的:

def replicate_recur(times, data, listTest=None): 
    # If a list has not been passed as argument create an empty one 
    if(listTest == None): 
     listTest = [] 
    # Return the list if we need to replicate 0 more times 
    if times == 0: 
     return listTest 
    # If we reach here at least we have to replicate once 
    listTest.append(data) 
    # Recursive call to replicate more times, if needed and return the result 
    replicate_recur(times-1, data, listTest) 
    return listTest 
+0

我得到一个工作是试图如果我可以做同样的递归。 Theres在 – Nix

+0

以下的完美答案我更新了我的答案,看看它并接受它,如果你认为这是你需要的 –

+0

谢谢,我以为你把它标记为答案 –

0

因为你重新定义RESULT2每次。保持result2不在函数中,它应该工作。

你也可以考虑做数据*倍复制,如果数据是一个列表或者干脆

(result2.append(data))*times 
+0

这将如何工作?也许迭代将有助于 – Nix

+0

因为列表会重演。例如[1,2] * 2 = [1,2,1,2] –

2

为了使您的代码的工作,需要下一个递归调用的输出extend在当前执行的列表。此外,递归的最低深度应times = 1定义:

def replicate_recur(times, data): 
    result2 = [] 
    if times == 1: 
     result2.append(data) 
    else: 
     result2.append(data) 
     result2.extend(replicate_recur(times - 1, data)) 
    return result2 

在另一方面,你可以简单地复制您的列表:

def replicate(times, data): 
    return [data]*times 
+0

不错的一个完美。所以我的代码的问题是,每次函数重新发生我的列表是空的? – Nix

+0

并非如此,您正在调用'replicate_recur',但没有对返回的结果进行任何操作。如果这是一个真正的用例,而不是学习递归函数的工作方式,请使用其他提供的方法。 – Adirio

0

在递归,每次replicate_recur被调用时,在新名称空间中创建一个新的结果2。

[data] * times 

会做你正在努力实现的。

+0

这将乘我的数据,而不是重复它 – Nix

+0

你看到方括号周围的数据?我在乘以包含您的数据的列表,这相当于重复。 –

2

您可以使用中间列表追加到每个递归调用中。这避免了这些问题,重新定义你遇到目前:

def replicate_recur(times, data, result=None): 
    if result is None: # create a new result if no intermediate was given 
     result = [] 
    if times == 1: 
     result.append(data) 
    else: 
     result.append(data) 
     replicate_recur(times - 1, data, result) # also pass in the "result" 
    return result 

当叫:

>>> replicate_recur(4, 2) 
[2, 2, 2, 2]