2015-06-22 82 views
0

我創建了一個函數,它將遞歸地反轉列表,但它使用全局列表來放置元素。 這可以重寫,以便它不會使用外部變量/列表來實現相同的結果。遞歸反轉列表

下面是代碼:

invs = [] 

def inv_list(list_, elem): 
    global invs 

    if elem is not None: 
     invs.append(elem) 

    if not list_: 
     return invs 

    else: 
     try: 
      el = list_.pop() 
      inv_list(list_, el) 

     except Exception: 
      pass 
+0

使用列表作爲arg –

+0

爲什麼不使用'reverse()'方法? – uname01

回答

2

什麼:

def inv_list(lst): 
    if not lst: 
     return [] 
    return inv_list(lst[1:]) + lst[:1] 
+0

bah比我快:P(+1好回答:P) –

+0

或'返回lst如果不是lst else lst [-1:] + inv_list(lst [: - 1])' –

+0

@PadraicCunningham我喜歡使用lst [-1:]而不是[lst [-1]](被盜!)。相反,我認爲當lst爲空時,返回空列表的副本而不是原始的lst是正確的。否則你有不一致的行爲 –

0

它看起來像你正在做很多更多的工作比你需要

def reverse_recurse(a_list): 
    if not a_list: 
     return [] 
    return [a_list.pop(),] + reverse_recurse(a_list) 
-1

的有問題的方法是簡單,只需使用默認參數。

def rec_reverse(input=[], output=[]): 
    if len(input) == 0: 
     return 
    else: 
     output.append(input.pop()) 
     rec_reverse(input, output) 
     return output 

x = list(range(10)) 
y = list(range(20)) 
print(rec_reverse(x, [])) 
print(rec_reverse(y, [])) 

只是記得通過一項新的列表輸出,這樣就可以不用變老值再次調用它。

然而,您可以用安全的方法,而無需使用默認參數:

def rec_reverse(input): 
    if not input: 
     return input 
    else: 
     return [input.pop(), ] + rec_reverse(input) 

而且你還可以使用它的遞歸等價的lambda表達式:

rec_reverse = lambda input=[]: [] if not input else [input.pop(), ] + rec_reverse(input) 

但請記住,那有沒有使用遞歸在所有一個更簡單的解決方案:

x = list(range(10)) 
rec_reverse = lambda input: input[::-1] 
print(rec_reverse(x)) 

由於在Python中,您可以使用extended slice notation來反轉任何列表。

另外,你可以使用reverse()並且省去你的麻煩。

def reverse(input): 
    input.reverse() 
    return input 
+2

'值得指出的是,使用列表作爲默認函數參數是有問題的,因爲每次使用默認參數時您將返回相同的實例。嘗試調用你的函數兩次。 – FatalError

+0

http://stackoverflow.com/q/1132941/3001761 – jonrsharpe

0

當你的實現可以以各種方式加以改進,當我發現我想建立一些遞歸不使用全局變量,也沒有留下接口覺得髒的就是創建一個嵌套的輔助函數:

def inv_list(list_): 
    invs = [] 

    def helper(elem): 
     if elem is not None: 
      invs.append(elem) 

     if not list_: 
      return invs 
     else: 
      try: 
       el = list_.pop() 
       return helper(el) 
      except Exception: 
       pass 

    return helper(None) 

這樣,您可以使用位於外部函數範圍內的值。

-2

大廈Rederick Deathwill,這裏是你的函數的簡化版本:

def inv_list(list_): 
    def inner(list_, invs): 
     if not list_: 
      return invs 
     else: 
      invs.append(list_.pop()) 
      return inner(list_, invs) 

    return inner(list_, []) 

它使用INVS默認值,爲全局變量來保存倒排列表擺脫的需要。隨着後續的調用,invs被傳遞,以便下一個調用可以構建它。

一旦達到調用堆棧的底部,該函數將返回反轉列表。原來的一個很好的補充是return inner(list_, invs)行,它允許調用者捕獲新列表作爲返回值。

這不是最短的,但我認爲它至少是可讀的。