我的世界递归原理?
先给出我的结论,在 模式下使用基于状态的递归是允许的(而且十分自然),但是效率很差。如果希望在 模式下追求高效率,那么请使用基于时间的递归算法。
在说为什么之前我们先引入一个概念——搜索树(search tree),它是一个抽象的数据结构用于表示递归搜索的过程,以二叉树为例: 每个节点代表一种可能的状态,叶子结点代表最终结果,有向边上的数值代表访问该状态时所花费的时间。这样的一个搜索树就完整地记录了一个递归过程。
当我们在一棵搜索树上进行遍历时,实际上就是不断向前追溯(深度优先搜索)或向后回溯(广度优先搜索),直到某时刻某个指针指向的节点被访问过两次(对于二叉搜索树,只需要一次),我们就找到了这个问题的解。
现在我们可以讨论这个问题了: 在 模式下使用基于状态的递归是否正确呢? 答案是肯定的,因为即使是在极限情况下所有的子问题都相互依赖无法独立求解,我们也能找到它们的解。只不过此时这个解可能不是最优的。
基于状态的递归能否高效地求出这个解呢? 这个就复杂一些了,首先我们要判断基于状态的递归是否会陷入无界循环。假设不会,那当然是最好不过,此时基于状态的递归能像在单机环境下一样高效地进行计算。然而假设会陷入无界循环,则情况就变得复杂起来。这个时候所谓的“高效”就不应该再是指所有时间都耗用在子问题求解上,而是指在不增加子问题求解次数的前提下尽量缩短每轮迭代所需总的时间。
考虑到不同模式的性能差异往往比采用不同的数据结构所带来的影响要大很多,因此下面我们只讨论 模式的情况。在这种情况下,为了避免陷入无界循环,我们对每一轮的迭代都增加一个步骤,即统计当前循环运行所消耗的总时间并记录下来,当后面某一个循环的耗时大于这个阈值的时候,就说明我们已经追踪到了某个已知的解,这时停止迭代即可。这个过程其实就相当于基于时间的递归。