2013-03-01 52 views
0

我想使用遞歸函數來反轉列表。 Unfortunatley我對遞歸相當陌生。這可能嗎?這是我的代碼迄今使用遞歸函數反轉字符串列表

def stringRev (word): 
    worLen = len(word) 
    if worLen == 1: 
     return word 
    return (word[-1]) + stringRev(word[:-1]) 

listWord = ["hey", "there", "jim"] 
print(stringRev(listWord)) 
+3

您的功能正常工作。這是錯誤的功能輸入。 – mgilson 2013-03-01 17:07:32

回答

4

您的問題是(word[-1])是一個字符串,而不是一個列表。所以你試圖添加/連接一個字符串和一個列表。我將該表達式更改爲[word[-1]]以創建一個列表。

>>> def stringRev (word): 
...  worLen = len(word) 
...  if worLen == 1: 
...   return word 
...  return [word[-1]] + stringRev(word[:-1]) 
... 
>>> listWord = ["hey", "there", "jim"] 
>>> print(stringRev(listWord)) 
['jim', 'there', 'hey'] 
>>> 

PS。如果包含運行代碼時收到的錯誤,將會有所幫助:TypeError: Can't convert 'list' object to str implicitly

3

要反轉列表的元素的順序,變更:

return (word[-1]) + stringRev(word[:-1]) 

return [word[-1]] + stringRev(word[:-1]) 

(注意括號)。

問題是,您試圖連接一個字符串(word[-1])與列表(word[:-1])。

的問題是,你的函數需要一個字,但你與單詞的列表調用它。

如果調用它,如下所示,你會看到,它工作得很好:

for word in ["hey", "there", "jim"]: 
    print(stringRev(word)) 

或者,如果你想顛倒字符串存儲在一個列表:

l = [stringRev(w) for w in ["hey", "there", "jim"]] 

的你的函數失敗的一個角落案例是空字符串。我不知道這是否是一個有效的輸入,所以它可能是一個沒有問題的問題(但是儘管如此仍然是微不足道的)。

+0

我試圖扭轉元素的順序 – 2013-03-01 17:14:54

+0

@ArkAngel:哦,我明白了。答案已更新。 – NPE 2013-03-01 17:19:36

1

如果你想在Python中完成:

reversed(listWord) 

假設詞是一個列表或元組

http://docs.python.org/2/library/functions.html#reversed

,得一個列表:

list(reversed(listWord)) 

應該工作

但是,如果你想要一個算法,我猜想顛倒不是你的朋友!

+2

請注意,'revers'不會返回一個字符串。它給你一個可迭代的對象。出於這個原因,你經常會看到'[ - - 1]'也反轉一個序列。 – mgilson 2013-03-01 17:13:27