Python 递归地反转列表

Python 递归地反转列表,python,Python,我创建了一个递归反转列表的函数,但它使用了一个全局列表来放置元素。 可以重写它,这样它就不会使用外部变量/列表来获得相同的结果 代码如下: invs = [] def inv_list(list_, elem): global invs if elem is not None: invs.append(elem) if not list_: return invs else: try:

我创建了一个递归反转列表的函数,但它使用了一个全局列表来放置元素。 可以重写它,这样它就不会使用外部变量/列表来获得相同的结果

代码如下:

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
那么:

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

看起来你做的工作比你需要的多得多

def reverse_recurse(a_list):
    if not a_list:
        return []
    return [a_list.pop(),] + reverse_recurse(a_list)
有问题的方法很简单,只需使用默认参数

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中,您可以使用来反转任何列表

此外,您可以使用倒档,省去了麻烦

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

虽然您的实现可以通过各种方式进行改进,但当我发现我想要构建一些递归的东西而不使用全局函数,并且不使接口感觉脏时,我需要创建一个嵌套的帮助器函数:

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)
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_, [])

这样,您就可以拥有外部函数范围内的值。

基于Rederick Deathwill,这里是您函数的简化版本:

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)
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被传递,以便下一个调用可以在其上构建

一旦到达调用堆栈的底部,函数将返回反向列表。对原始列表的一个很好的补充是returninnerlist,invs行,它允许调用者捕获新列表作为返回值


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

或者返回lst if not lst else lst lst[-1:]+inv_listlst[:-1]@padraiccningham我喜欢使用lst[-1:]而不是[lst[-1]]的想法!。相反,我认为当lst为空时,返回空列表的副本而不是原始lst是正确的。否则您的行为会不一致EP,您还可以返回[]if not lst else lst[-1:]+inv_listlst[:-1]将列表用作参数为什么不使用反向方法?值得指出的是,使用列表作为默认函数参数是有问题的,因为每次使用默认参数时都会返回相同的实例。尝试调用函数两次。