【问题标题】:How does the control flow in a recursive program work?递归程序中的控制流是如何工作的?
【发布时间】:2023-02-06 22:21:33
【问题描述】:

我不确定为什么这段代码会打印出“5678998765”。我看到它是如何获得 56789 部分的,但是当数字开始下降时,我感到很困惑。因此,如果有人可以解释,我将不胜感激。

int out(int k) {

    if (k == 10) {
        return 1;
    }
    printf("%d", k);
    out(k +1);
    printf("%d", k);
}


int main()
{
    out(5);
    return 0;

【问题讨论】:

  • 它打印每个数字两次:一次在进出的路上,一次在出出的路上。例如,当9 被打印时,out(9+1) 什么都不做,下一个9 被立即打印。在递归过程中,其他数字的输出被中间发生的任何事情分开。
  • 了解如何使用调试器。
  • 这是序列 -> print(5) -> recursive(6) -> print(6) -> ... print(9) -> recursive(9) -> return 1 -> print(9) -> return void -> print(8) -> return void -> print(7) ->return void -> print(6) ->return void -> print(5) -> return void。在递归完成之前,不会调用第二次打印,然后开始从上到下打印。顺便说一句,虽然它有效,但您应该返回一个 int 值,因为您的函数是 int 类型的。虽然它可以是无效的。
  • 你期待什么? “5678999999”?或者只是“56789”
  • ...所以这个数字并没有“变小”。它们与第一次打印时相同,例如 5678998765.

标签: c function recursion


【解决方案1】:

它是从最后一个printf开始打印的,每个函数都需要执行到最后。

int 输出(int k){

if (k == 10) {
    return 1;
}
printf(" + %d", k);
out(k +1);
printf(" - %d", k);

}

你应该试试这个,它会更清楚。

【讨论】:

    【解决方案2】:

    k 的每个值不等于 10 的函数中,有两次调用 printf

    printf("%d", k);
    out(k +1);
    printf("%d", k);
    

    因此,如果在 k 等于 5 时第一次调用该函数,那么您将拥有

    5 ( a call of out( 6 ) ) 5
    

    然后在递归调用中你会重

    56 ( a call of out( 7 ) ) 65
    

    等等。

    k 等于10 时,什么都不输出。

    【讨论】:

      【解决方案3】:

      main评估out(5)时,out运行并执行以下操作:

      • k 不是 10,所以继续。
      • 打印k,即5。
      • 评估out(6)
      • 打印k,即5。

      评估out(6),所以用out做的替换步骤“评估out(6)”:

      • k 不是 10,所以继续。
      • 打印k,即5。
        • k 不是 10,所以继续。
        • 打印k,即6。
        • 评估out(7)
        • 打印k,即6。
      • 打印k,即5。

      现在您可以看到该程序将打印 5,然后是 6,然后评估 out(7),然后打印 6,然后打印 5。继续进行直到我们有:

      • k 不是 10,所以继续。
      • 打印k,即5。
        • k 不是 10,所以继续。
        • 打印k,即6。
          • k 不是 10,所以继续。
          • 打印k,即7。
            • k 不是 10,所以继续。
            • 打印k,即8。
              • k 不是 10,所以继续。
              • 打印k,即9。
                • k 是 10,所以返回 1。
              • 打印k,即9。
            • 打印k,即8。
          • 打印k,即7。
        • 打印k,即6。
      • 打印k,即5。

      【讨论】:

        猜你喜欢
        • 2017-01-18
        • 2021-01-19
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 2014-06-22
        • 1970-01-01
        • 2017-03-31
        相关资源
        最近更新 更多