2015-10-21 71 views
3

是否有一种替代方法来颠倒python中的列表使用递归?这里是我的代码:使用递归在python中反转列表?

revList=[] 
def reverseList(listXS): 
    if(len(listXS)==1): 
     revList.append(listXS[0]) 
    else: 
     current= listXS.pop() 
     revList.append(current) 
     reverseList(listXS) 
    return revList 

testList= ["mouse","dog","cat"] 
print(testList) 
print(reverseList(testList)) 
+1

你的意思是有递归替代(是的,你可以使用迭代),还是有一个替代实现仍然使用递归(也是)?你当前的代码是否存在一些问题(除了全局范围的'revList'会给你...下一个列表上有趣的结果你反向)? – jonrsharpe

+1

@jonrsharpe我想他想知道是否有一个使用递归算法的替代实现。 – jlnabais

+0

@jlnabais似乎没有什么意思在猜测! – jonrsharpe

回答

1

如果你想要一个替代递归方法:

def reverseList(listXS): 
    return [] if not listXS else [listXS.pop()] + reverseList(listXS) 

或者切片:

def reverseList(listXS): 
    return [] if not listXS else listXS[-1:] + reverseList(listXS[:-1]) 

如果你想就地解决方案:

def reverseList(listXS, i=1): 
    if i == len(listXS) - 1: 
     return 
    listXS[i-1], listXS[-i] = listXS[-i], listXS[i-1] 
    reverseList(listXS, i+1) 

扭转了最初的名单:

In [22]: l = [1, 2, 3, 4,5] 
In [23]: reverseList(l)  
In [24]: l 
Out[24]: [5, 4, 3, 2, 1]  
In [25]: l = [1, 2, 3, 4]  
In [26]: reverseList(l)  
In [27]: l 
Out[27]: [4, 3, 2, 1] 
+1

你的答案就是我正在寻找的!非常感谢你 !!! –

+0

@MichaelAndréSlimz,不用担心,不客气。 –

0

如果你想使用递归,你可以不喜欢这样,但它基本上是实现一个for循环不同的方式

def rev(x,y=None): 
    if y is None: 
     y = [] 
    y.append(x.pop()) 
    if x: 
     y = rev(x,y) 
    return y 

print rev([1,2,3,4,5],[]) 

[5, 4, 3, 2, 1] 
+0

这通常是用'y = None'实现,然后'如果y是None:y = []'在函数内部,所以你不必明确地传递一个空列表。 – jonrsharpe

+0

@jonrsharpe好点。固定 – SirParselot

0
def rev_list(l): 
    if not l: 
     return [] 
    else: 
     return l[-1:] + rev_list(l[:-1]) 

print(rev_list([1,2,3,4,5])) 

[5, 4, 3, 2, 1] 
+1

这和我自己的答案完全一样,在你之前发布很久,你有习惯复制答案 –

+1

@PadraicCunningham我没有应对的习惯。在我发布之前,我甚至没有看到其他人对OP问题的回答。这是一个简单的递归,没有发明,它就像乘法表一样。所以当你增加数字时,人们会偷窃你?你的指责很荒谬。 – LetzerWille

1

a function此:

>>> [1,2,3,4,5].reverse() 
[5,4,3,2,1] 
-1

速记:: - 1适用于反转阵列。它也适用于numpy数组以反转任意维度。

内置方法通常(通常很大程度上)优于手动执行。

>>> testList= ["mouse","dog","cat"] 
>>> testList[::-1] 
['cat', 'dog', 'mouse']