【问题标题】:Can anyone explain and trace the following multiple recursive C program? [closed]任何人都可以解释和跟踪以下多个递归 C 程序吗? [关闭]
【发布时间】:2016-09-28 02:03:19
【问题描述】:

我试图了解递归是如何工作的。我似乎不明白这种多重递归是如何工作的。请帮忙,谢谢!

Here is the output

#include<stdio.h>
int R(int x);

int main()
{
    R(5);
    return 0;
}

int R(int x)
{
    if(x > 0){
        x--;
        R(x);
        R(x - 2);
        printf("%d ", x);
    }
}

【问题讨论】:

  • 可以使用调试器逐行跟踪它。
  • 另外,请注意,像这样使用递归是非常糟糕的做法。与其编写这种不必要的复杂代码,不如使用循环。
  • 我只能在调试器中逐行看到它,我想了解它为什么会出现在那里。它去那里的逻辑是什么? (我特意写了这样的代码来理解递归。我无法理解 Mergesort 之类的多重递归)

标签: c recursion


【解决方案1】:

R(5) 调用R(4) 会显示一些东西,然后调用R(2) 也会显示一些东西。之后R(5) 显示4。这就是为什么您在输出末尾看到 4 的原因。

R(4)显示 - R(2)显示 - 4

在 4 之前你有 R(2) 的显示。 R(2) 调用 R(1) 显示一些东西,然后调用 R(0) 显示什么。 R(2) 显示 1。这就是为什么在 4 之前最后有一个 1。

R(4)显示 - R(1)显示 - R(0)显示 - 1 4

等等……

R(4)显示 - R(1)显示 - 1 4

R(4)显示 - 0 1 4

您总是从末尾开始处理 R()display 调用(右侧优先)。

如您所见,递归将反转数字的顺序(4,最大的数字,排在最后)。这是因为你在递归调用 R 之后有 printf

【讨论】:

  • 我还是无法理解。究竟会发生什么?我只能在调试器中看到它逐行运行,我想了解它为什么会出现在那里。它背后的逻辑是什么?
  • “那里”是什么意思?
  • “那里”是指下一行执行
  • 当执行点到达对 R() 的调用时,它将直接跳回到函数 R 的顶部。但这是对 R 的另一个调用,具有不同的参数(x 递减)。这就是递归的含义:R 正在调用自身,因此您将在对 R 的另一个调用中对 R 进行一次调用等。
【解决方案2】:

看看我做的跟踪树

R(5) 表示 R 函数对 5 的调用,如您所知,它的输出将是 4。数字显示函数执行到结束的顺序。旁边有勾号的会输出。

【讨论】:

  • 我还是无法理解。您能否详细说明数字的印刷方式?
  • 正如您在图像中看到的那样,R(5) 开始执行,在第三行中它将调用 R(x)(在本例中为 R(4))。 R(4) 将调用 R(3)。 R(3) 将调用 R(2),R(2) 将调用 R(1),R(1) 将调用 R(0)。 R(0) 将一直​​执行到函数结束,并且将在没有输出的情况下返回。我们将返回到 R(1),编译器将从 R(0) 的下一行执行并调用 R(-1)。它也将在没有任何输出的情况下返回。 R(1) 中的下一行将打印 0 并且函数结束。我们将返回到 R(2) 并继续执行。只需像这样分析树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2015-05-24
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
相关资源
最近更新 更多