从循环内部删除递归

Removing recursion from inside of a loop

给出的代码看起来像这样(伪代码):

f(args)
    result = simple_case
    if (base_case(args))
        return result
    new_args = args
    for each x in args list
        remove x from new_args
        if (need_to_update_result_based_on_x(result,x))         
            result = f(new_args)
    return result

我已经知道如何从函数中删除尾递归,但我不确定是否有直接的技术来删除本身在循环内的递归,如上所述。

特别想知道能不能改写成迭代?我的意思是它甚至不需要通过简单地实现它自己的堆栈来有效地模拟递归设计?如果不是,重写此类函数的最经济(就存储和时间而言)的方法通常是什么?

函数中 for 循环的每次迭代都会减少 args 列表,并且减少的列表也会传递给下一个递归调用。因此,当递归调用 returns 时,循环会使用它在进行递归调用时所拥有的列表,但递归调用本身已经为该列表的简化版本计算出结果。

为了避免重做已经完成的工作,您可以缓存之前递归调用的结果,这样以后的递归调用就不需要重做完整的计算。这种技术通常被称为 memoization.

因此,要完全删除递归,可以预先计算基本情况结果并记住(记忆)。这些记忆可用于计算基本案例加上列表中其他参数之一的结果,并且这些结果也被记忆(此时,基本案例结果可以被丢弃)。您可以为每个连续的较大列表大小重复计算记忆,直到获得所需参数列表的结果。