给出看起来像这样的代码(伪代码):
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
我已经知道如何从函数中删除尾递归,但我不确定是否有直接的技术来删除循环内部的递归,如上所述。
特别是,我特别想知道是否可以重写它以便纯粹迭代?我的意思是它甚至不需要通过简单地实现它自己的堆栈来有效地模拟递归设计?如果没有,通常最经济的(在存储和时间方面)重写这样一个函数的方式是什么?
答案 0 :(得分:2)
args列表通过函数中for
循环的每次迭代减少,减少的列表也传递给下一个递归调用。因此,当递归调用返回时,循环将获取它在进行递归调用时所具有的列表,但递归调用本身已经为该列表的简化版本计算出结果。
为了避免重做已完成的工作,可以缓存先前递归调用的结果,以便将来的递归调用不需要重做完整的计算。此技术通常称为 memoization 。
因此,要完全删除递归,可以预先计算基本案例结果并记住(记忆)。这些记忆可用于计算基本案例的结果加上列表中的其他参数之一,并且这些结果也被记忆(此时,基本案例结果可以被抛出)。您可以为每个连续的较大列表大小重复计算记忆,直到获得所需参数列表的结果。