algorithm - 不使用递归重写递归函数

标签 algorithm recursion url-rewriting non-recursive

我正在重写一些现有的代码,其中递归调用既不容易实现也不需要。 (在 Fortran 77 中,如果你必须知道的话。)我考虑过从头开始创建一个堆栈来跟踪所需的调用,但这看起来很笨拙,而且我宁愿不为数组分配内存,以防递归并不深。 (我不确定 Fortran 77 是否支持动态数组大小调整。)

关于如何采用明显的递归函数并以非递归方式重写它而不浪费堆栈空间的通用解决方案的任何其他建议?

最佳答案

如果您的代码使用尾递归(即,函数直接返回每个递归调用的结果而无需任何其他处理),那么可以在没有堆栈的情况下命令式地重写函数:

function dosomething(a,b,c,d) 
{
  // manipulate a,b,c,d
  if (condition) 
    return dosomething(a,b,c,d) 
  else
    return something;
}

进入:

function dosomething(a,b,c,d) 
{
  while (true) 
  {
    // manipulate a,b,c,d
    if (condition) continue;
    else return something;
  }
}

如果没有尾递归,使用堆栈(或类似的中间存储)是唯一的解决方案。

关于algorithm - 不使用递归重写递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4422032/

相关文章:

c++ - 具有指针 C 成员的类 C 的析构函数

algorithm - 递归、内循环和时间复杂度

algorithm - 矩阵中可能存在的矩形数量

python - Python 中的性能改进基础知识

java - 如何返回 BoundingVolume 中的所有点

laravel - 通过递归获取树

IIS7 URL重写到不同的域,完全匹配

.Htaccess 重定向的正则表达式

javascript - Angular module.run ReferenceError : $location is not defined

algorithm - 子序列的最大长度,使得每个连续元素的按位异或为 k