Recursion 从循环内部移除递归

Recursion 从循环内部移除递归,recursion,memoization,Recursion,Memoization,给定类似以下内容的代码(伪代码): 我已经知道如何从函数中删除尾部递归,但我不确定是否有直接的技术可以删除循环内部的递归,如上所述 特别是,我特别想知道是否有可能重写它,使其纯粹是迭代的?我的意思是,它甚至不需要通过实现自己的堆栈来有效地模拟递归设计?如果不是,重写这样一个函数通常最经济的方法是什么(从存储和时间角度考虑)?函数中for循环的每次迭代都会减少args列表,并且减少的列表也会传递给下一个递归调用。因此,当递归调用返回时,循环将使用它在进行递归调用时拥有的列表,但是递归调用本身已经为

给定类似以下内容的代码(伪代码):

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


特别是,我特别想知道是否有可能重写它,使其纯粹是迭代的?我的意思是,它甚至不需要通过实现自己的堆栈来有效地模拟递归设计?如果不是,重写这样一个函数通常最经济的方法是什么(从存储和时间角度考虑)?

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

为了避免重做已经完成的工作,您可以缓存以前递归调用的结果,以便将来的递归调用不必重做完整的计算。这种技术通常被称为


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

是否
simple\u case
是常数?在递归部分,您将
f(新参数)
赋值给
result
-是否确定您的目的不是以某种方式聚合结果?否,但它是从args中最多前k个条目派生出来的,k是常数。如果不使用额外的O(args.length)内存(它可能是单独的堆栈或每个args[i]的未使用字段),则不可能以纯粹的迭代方式重写此代码。请给出评估信息:1)需要多少字节来存储
结果
,2)需要多少字节来存储一个参数
args[i]
,3)列表
args
中有多少个参数,4)需要基于x(result,x)更新结果以返回
true
,从后面开始计算结果的概率是多少(意思是,首先是最后一个论点,然后是最后两个论点,依此类推)并缓存这些结果-这样您可以完全跳过递归。@CptBartender:谢谢,相应地扩展了答案。@CptBartender:您能否详细说明我必须如何重写函数才能执行类似操作?请参阅@jxh的更新答案-它很好地涵盖了这方面。请参阅及其副本。
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