【问题标题】:Understand output of C code which uses recursion了解使用递归的 C 代码的输出
【发布时间】:2021-09-01 21:53:01
【问题描述】:

查看这段代码,它以通常的方式将值传递给函数(按值,而不是通过引用/指针):

funky(x)
{

   if (x > 0) {

     x -= 1
     funky(x)

     }

    printf("%d," x)
}

int tester()
{

   funky(x passed in as 5)

   return 0

}

显示的输出是什么?

int tester 是否作为顶部 x 的值传入,funky(x) -= 1 代码?如果是的话,那只会打印4吗?没有任何东西被声明为 intstring,所以我不确定会打印什么。

【问题讨论】:

  • 你为什么不运行它看看结果是什么(在将它修复为真正的代码以便它真正编译之后)?
  • 你编译成功了吗?我对此表示怀疑。如果您是编码新手,您应该首先通过以下教程积累一些经验,直到您可以自己创建简单的类似 HelloWorl 的程序。然后您可以发现显示的代码中会触发错误的部分、缺少的; s 以及其中一个函数调用的() 内的注释。然后,只有那时,而不是更早,你应该阅读“递归”。这绝对不是您似乎处于的初学者级别的主题。
  • 一个可以帮助您了解递归函数的简短答案是Recursion flow in c language and how the output is printed 理解该函数的最佳方法是拿出一张 8.5x11 的纸并跟踪递归调用时的变量值制成。只需写出函数调用发生的情况,然后是递归调用 1、递归调用 2 等。记住,最后,当递归开始 Unwind 时,控制返回到递归调用的点制作完成。
  • 如果你想讨论一段代码的输出,请提供它的minimal reproducible example 并显示你得到的输出,然后讨论它并询问你没有得到的部分。讨论非编译代码行为是不可能的。和“请预测这段代码的行为”。即使代码可以运行也不是 StackOverflow 问题。
  • 我想知道语法错误是否是测验网站上错误代码的指标,或者是故意防御人们只是将代码复制到某处以获得输出而不考虑......

标签: c recursion


【解决方案1】:

我决定通过为您提供实际可编译的代码来帮助您学习,我相信这些代码将进一步实现与您当前正在学习的内容完全相同的学习目标。我当然不会为您提供显示代码的输出(或显示的代码更改为可编译)。有两个原因。一:我不想给你做测验。二:我想帮助你学习,而不是阻碍你。

所以这段代码,如果编译并运行:

#include <stdio.h>

int funky(int x)
{
   printf("in  %d, ", x);
   if (x > 0)
   {
     x -= 1;
     printf("mid %d, ", x);
     funky(x);
   }
   printf("out %d, ", x);
}

int main()
{
   funky(/* x passed in as */ 5);
   return 0;
}

将为您提供有希望的启发性输出:

in  5, mid 4, in  4, mid 3, in  3, mid 2, in  2, mid 1, in  1, mid 0, in  0,
out 0, out 0, out 1, out 2, out 3, out 4, 

它通过明确哪个输出是由哪个代码部分引起的来支持您的理解。我添加了第二个和第三个输出来帮助您理解测验代码中使用的递归技巧。我在输出中添加了一个换行符,只是为了这里的可读性。 (这里故意不给字符精确输出的副作用......)

通过代码中的语法修复,我打算回答您帖子中的附带问题,而真正的难题通过递归调用前后相关值的可视化得到澄清。

【讨论】:

  • 谢谢云诺施!这有助于我更好地理解它。
  • 很高兴知道这一点。我可以让你知道这个stackoverflow.com/help/someone-answers 吗?它不需要您接受答案。但如果没有一个能让你满意,你会想要解释缺少什么。您可能还会发现 tour 很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2023-02-21
相关资源
最近更新 更多