【发布时间】:2015-07-21 06:46:41
【问题描述】:
给定的代码看起来像这样(伪代码):
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
我已经知道如何从函数中删除尾递归,但我不确定是否有直接的技术可以删除本身位于循环内部的递归,如上所述。
特别是,我特别想知道是否可以重写它以使其纯粹迭代?我的意思是它甚至不需要通过简单地实现它自己的堆栈来有效地模拟递归设计?如果不是,那么重写此类函数通常最经济(就存储和时间而言)的方式是什么?
【问题讨论】:
-
simple_case是常量吗? -
在递归部分,您将
f(new_args)分配给result- 您确定您的意图不是以某种方式聚合结果吗? -
不是,但它是从 args 中的前 k 个条目派生而来的,并且 k 是常数。
-
如果不使用额外的 O(args.length) 内存(它可能是单独的堆栈或每个 args[i] 的未使用字段),不可能以纯迭代方式重写此代码。
-
请给出评估信息:1)需要多少字节来存储
result,2)需要多少字节来存储一个参数args[i],3)列表中有多少参数@ 987654327@, 4)need_to_update_result_based_on_x(result,x)返回true的概率是多少?
标签: recursion memoization