【问题标题】:How exactly does this recursive code works?这个递归代码究竟是如何工作的?
【发布时间】: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 &lt; j,但我们只能猜测。
  • 我也是这么想的。无论如何,假设它应该是“如果 i
  • 我不知道它计算的是什么。

标签: algorithm recursion stack iteration


【解决方案1】:

抛开发散问题,算法等价于

return i

这可以通过调用堆栈深度的归纳来证明。如果 if 条件为假,则返回值为i。否则,我们计算ret = i(如Algo(A, i, floor((i+j)/2))),然后对一些x 增加Algo(A, x, j) - x = 0,同样通过归纳法。

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 2013-03-09
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2021-07-05
    • 2021-04-11
    相关资源
    最近更新 更多