【发布时间】:2016-01-28 14:08:02
【问题描述】:
我有以下伪代码:
function X(data, limit, level = 0)
{
result = [];
foreach (Y(data, level) as entity) {
if (level < limit) {
result = result + X(entity, limit, level + 1);
} else {
//trivial recursion case:
result = result + Z(entity);
}
}
return result;
}
我需要把它变成一个普通的(例如,没有递归调用)。到目前为止,我对如何优雅地做到这一点一无所知。在this 的回答之后,我看到我必须构建整个堆栈帧,它们基本上是代码重复(即,我将一次又一次地放置相同的代码并使用不同的返回地址)。
或者我尝试了 these suggestions 之类的东西 - 有一个短语
- 查找不是尾调用的递归调用。
- 确定该调用与其返回语句之间正在完成的工作。
但我不明白在内部循环中发生的情况下如何识别“工作”。
所以,我的问题是,上面的所有示例都提供了“可以轻松识别工作”的情况,因为函数内部没有控制指令。我了解编译级别递归背后的概念,但我要避免的是代码重复。所以,
我的问题:如何处理上述伪代码的转换,这并不意味着模拟堆栈帧的代码重复?
【问题讨论】: