2015-06-22 147 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)行,它允许调用者捕获新列表作为返回值。

这不是最短的,但我认为它至少是可读的。