【发布时间】:2021-05-25 00:50:39
【问题描述】:
我有一个问题,我需要生成一些自然递归计算的东西,但如果需要,我还需要能够询问递归中的中间步骤。
我知道我可以通过传递和改变列表或类似结构来做到这一点。但是,这对我来说看起来很丑,我相信一定有一个更整洁的方法,例如使用发电机。理想情况下,我希望能够做的事情是:
intermediate_results = [f(x) for x in range(T)]
final_result = intermediate_results[T-1]
以一种有效的方式。虽然我的解决方案不是性能关键,但我无法证明第一行中大量的冗余工作是合理的。在我看来,生成器将是完美的选择,除了 f 在我的情况下从根本上更适合递归(至少在我看来,这与生成器完全相反,但也许我是只是没有跳出框框思考)。
有没有一种简洁的 Pythonic 方式来做这样的事情,我只是不知道,还是我只需要通过传递一个 intermediate_results 列表来投降和污染我的函数 f 然后我对其进行变异作为副作用?
【问题讨论】:
-
f(x)可以使用memoization吗?如果是这样,可以查询内存表以获得中间结果。 -
您可以创建一个附加函数,例如
logger,它将记录传递给它的任何值的结果。这个logger可能很难看,但是您的递归函数将只包含对这个logger的调用,并将值作为参数传递给记录,这样看起来会更干净。 -
我知道这个问题已经回答了,但无论如何让我想知道。在计算最终结果之后,您真的需要所有中间结果吗?如果不是这样,那么memoization可能不是最好的解决方案,最好玩一下程序的逻辑
-
@heinwol 我的问题是我有许多函数以某种顺序重复应用于初始值。例如,f(x) = g(x) + a、g(x) = h(x) - b 和 h(x) = f(x-1) * (1+c),有一些初始边界像 f(0) = 0 这样的条件。这些函数的细节没有预先定义,但是用例会调用,比如 f(10)。但是,如果 f(10) 被证明是违反直觉的,则有时有必要查看 g(10)、h(10)、f(9)、g(9) 的结果......所以是的,这个只有在计算结果后才需要进行中间检查,而且只是有时。
-
@heinwol 只是为了进一步了解 - 这种事情用电子表格非常简单。我只需为每个函数设置一个列,中间结果就会自然而然地出来。使用电子表格还有其他一些我想避免的缺点,但是能够自然地看到像这样的递归计算的中间结果真的很好。我希望我可以用数据框做类似的事情,但即使使用上面高度简化的示例,这似乎也不是一件容易的事;至少在没有先计算一切的情况下并非如此。
标签: python recursion functional-programming generator