如何在不停止递归的情况下返回递归函数中的值?

Posted

技术标签:

【中文标题】如何在不停止递归的情况下返回递归函数中的值?【英文标题】:How can I return values in a recursive function without stopping the recursion? 【发布时间】:2012-03-31 21:11:24 【问题描述】:

我有一个结构,列表中有 x 个列表,每个列表都有 x 个元组。我事先不知道有多少个嵌套列表,或者每个列表中有多少个元组。

我想从所有元组中制作字典,因为我不知道要使用递归的列表的深度。我所做的是

def tupleToDict(listOfList, dictList):
    itemDict = getItems(list)  # a function that makes a dictionary out of all the tuples in list
    dictList.append(itemDict)
    for nestedList in listOfList:
         getAllNestedItems(nestedList, dictList)

    return dictList

这行得通,但最后我得到了一个巨大的列表。我宁愿在每一轮递归中返回 itemDict。但是,我不知道如何(如果可能的话)在不停止递归的情况下返回一个值。

【问题讨论】:

如果你有一个元组列表,你可以通过简单地使用dict(l)来创建一个字典... 【参考方案1】:

您有两种可能的解决方案:

    生成器方法:带有 yield 语句的函数,在递归函数中实现可能很麻烦。 (以 phihags 提案为例)

    回调方法:您从递归内部调用辅助函数/方法,并可以通过第二个外部函数监控进度。

这里是一个非递归递归示例:;-)

def callback(data): print "from the depths of recursion: 0".format(data)

def recursion(arg, callbackfunc):
    arg += 1
    callbackfunc(arg)
    if arg <10:
        recursion(arg, callbackfunc)
    return arg

print recursion(1, callback)

【讨论】:

【参考方案2】:

我不确定您要做什么,但您可以尝试通过使用 yield 语句以所需的时间间隔返回 dict 来创建递归生成器。要么将其复制到全局列表中?

【讨论】:

【参考方案3】:

你正在寻找yield:

def tupleToDict(listOfList):
    yield getItems(listofList)
    for nestedList in listOfList:
        for el in getAllNestedItems(nestedList):
            yield el

在 Python 3.3+ 中,您可以将最后两行替换为 yield from

您可能希望将函数重写为迭代:

def tupleToDict(listOfList):
    q = [listOfList]
    while q:
        l = q.pop()
        yield getItems(l)
        for nestedList in listOfList:
            q += getAllNestedItems(nestedList)

【讨论】:

yield 的使用很棒!谢谢! 可能存在生成器模式不够用的用例,因为缺少可迭代对象。我想到了近似、边界条件或一些分形算法。生成器动态创建可迭代对象,但如果您不需要迭代,则可能需要寻找另一种方法或重构原始解决方案以匹配生成器模式。 - 只是要记住的网站注释! ;-)【参考方案4】:

你要把它还给谁?我的意思是,如果你的线程忙于运行递归算法,谁来处理“中间结果”?

最好的办法是在再次递归之前调整你的算法以包含一些处理。

【讨论】:

以上是关于如何在不停止递归的情况下返回递归函数中的值?的主要内容,如果未能解决你的问题,请参考以下文章

算法回溯:如何在不存储状态的情况下进行递归

Java如何在不使用递归的情况下导致栈溢出?

如何在没有转义序列的情况下停止递归

如何在不递归的情况下找到所有可能的字谜?

python基础:递归函数返回值(return)误区

如何在不使用递归或`/`运算符的情况下进行除法?