【发布时间】:2021-01-27 01:42:03
【问题描述】:
我是一名计算机科学新秀,最近进入大学。我正在准备这次考试,我必须将递归算法转换为迭代形式。
我觉得这很难,因为在我要报告的这个具体例子中,我完全不明白这个算法到底应该做什么。因此,我不知道如何转换它。希望你能帮帮我。
文本格式:
Algo(A, i, j)
ret = i
if (i <= j) then
ret = Algo(A, i, ⌊(i+j)/2⌋)
k = ret + 1
while k <= j && A[k] <= A[ret] do
k = k + 1
if k % 2 = 1 then
ret = Algo(A, k, j) + ret - k
else
ret = Algo(A, k/2, k) + ret - k/2
return ret
我知道这听起来很愚蠢,但是……我发现这是一个无限循环。鉴于“i”是我们数组的第一个索引,而“j”是最后一个索引,所以永远不会出现“if i
我真的在为此苦苦挣扎。将其转换为迭代并不是很简单,尽管我的教授给了我一个可以遵循的方案,但我一点也不觉得这很容易。
仅供参考,这是他告诉我要遵循的方案:
while (!termination)
if (new call) then
''simulate the beginning of a new call''
else
''retrieve context from stack''
if (first call) then
...
''execute second call''
else
...
''end simulation''
希望你能帮助我。仅仅了解这个程序是如何工作的,尤其是递归,对我来说意义重大。提前致谢。
【问题讨论】:
-
伪代码错误。实际上,它会遇到无限递归。但是
Algo(A,i,[(i+j)/2]有几个语法问题......你确定你没听错吗? -
@trincot 我添加了代码屏幕。是的,我忘了关闭最后一个括号。查看图像以获得更详细的外观。感谢您的宝贵时间。
-
确实,我确认,算法很糟糕。可能
if应该是if i < j,但我们只能猜测。 -
我也是这么想的。无论如何,假设它应该是“如果 i
-
我不知道它计算的是什么。
标签: algorithm recursion stack iteration