递归函数

时间:2012-03-27 07:23:51

标签: python list function recursion

假设我有一个递归函数,可以在列表中创建列表。它返回的内容如下:

['a', ['b', ['c', ['d', []]]], 'z', []]

让我们将此列表称为LIST1

然后我有一个获取该列表的函数,并为我清理它,基本上删除了z.Lets调用此列表LIST2

[a,b,c,d]

我可以做的是调用我的第一个函数并接收我的列表,然后(在python shell中)调用LIST1上的清理函数将其转换为LIST2。我想要做的是在LIST1返回后立即进行清理操作,基本上在我的列表生成器功能中进行清理操作。

我很困惑我应该如何调用一个函数来改变递归函数的结果,而不会搞砸递归函数。

我不想详细讨论我的代码,因为它相当复杂且嵌套很多,但如果你想让我澄清一下,请提出问题。

如果它有助于可视化问题,可以用更简单的术语来设想。我有一个返回值的函数,我想要另一个函数来操作该值,但是在第一个函数中。

干杯,

3 个答案:

答案 0 :(得分:1)

这是你想要做的吗?

import collections

result = ['a', ['b', ['c', ['d', []]]], 'z', []]

def get_result() :
    for r in result :
        yield r


def flatten(l):
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
            for sub in flatten(el):
                yield sub
        else:
            yield el


def remove_z(l) :
    for i in l :
        if i != 'z' :
            yield i

print [ l for l in remove_z(flatten(get_result()))]

结果是

['a', 'b', 'c', 'd']

'flatten'功能来自:https://stackoverflow.com/a/2158532/16718

答案 1 :(得分:0)

我可能会遗漏一些东西,但为什么不在递归函数的最终结果上调用清理函数呢?例如

result = cleanup(recursive())

答案 2 :(得分:0)

除非您提供有关递归函数和清理函数的更多详细信息,否则很难解决您的问题

然而,我设计了一个微不足道的例子,可能与你目前正在做的类似。正如你所看到的那样,正如@Daniel所提到的,嵌套调用确实按照它应该的方式运行

以下是示例

鉴于

>>> def Wind(p):
    if not p:
        return []
    return [p[:1] + Wind(p[1:-1])+p[-1:]]

>>> Wind(range(1,10))
[[1, [2, [3, [4, [5, 5], 6], 7], 8], 9]]

>>> def UnWind(p):
    if not p:
        return []
    return p[:1] + UnWind(p[1:-1][0])+p[-1:]

因此你会看到风之后UnWind的效果非常好。

>>> UnWind(Wind(range(1,10))[0])
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9]