使用递归将链接列表项追加到列表中

时间:2014-10-19 00:24:58

标签: python list recursion

我有这个:

def ppend(n):
    lis = []
    if n.rest == None:
        pass
    else:

        lis.append(n.first)
        ppend(n.rest)

    return lis

n是一个链表[1,2,3]

我得到的输出是:

[1]

但我要找的输出是:

[1,2,3]

1 个答案:

答案 0 :(得分:2)

您正在每次递归时创建一个新的lis列表。 (顺便提一下,您可能会尝试查找更多描述性名称。)但是,只返回第一个列表,因为您不会对递归产生的其他列表执行任何操作。相反,您只需调用该函数,该函数只创建一个新列表,而不对函数返回的值执行任何操作。您可以在以下行中看到:

ppend(n.rest)  # a new list is created but nothing is done with the result of the function

如果您只计划使用该功能一次,则只需将lis分配移到功能之外:

lis = []

def ppend(n):
    if n.rest is not None:  # the first if statement appears unnecessary
        lis.append(n.first)
        ppend(n.rest)
    return lis  # or don't return it but simply refer to lis where you need to

但是,如果您计划多次使用该功能并且始终需要新列表,则上述方法也不会起作用。在后一种情况下,您可以添加第二个函数,如下所示:

def make_ppend(n, lis):  # add lis as a parameter to be explicit, but you could rely on scope instead of adding this extra parameter
    if n.rest is not None:
        lis.append(n.first)
        make_ppend(n.rest, lis)

def ppend(n):
    lis = []  # now in the local scope
    make_ppend(n, lis)
    return lis

我猜你是在追求第二种解决方案。