使用 main 函数进行递归

Posted

技术标签:

【中文标题】使用 main 函数进行递归【英文标题】:Recursion using the main function 【发布时间】:2020-09-09 00:03:10 【问题描述】:

我需要找到这段代码的输出。我知道这是递归,但我不完全知道这段代码是如何工作的。我认为这将是一个无限代码,但事实并非如此。有人可以解释一下吗?

 #include <stdio.h>
 char *str = "kre";
 void main(void) 
     int i;
     static int j = 3;
     for (i = 0; i < j; i++) 
         printf("%d ", j--);
         main();
     
     printf("%sn%c ", str, 'i');
 

【问题讨论】:

建议:使用调试器单步执行您的程序。 建议 2:使用 indentation style 而非“所有内容左对齐” 【参考方案1】:

我认为这将是一个无限代码,但事实并非如此

这不是无限代码,因为您将 static 声明为 j(参见 What does “static” mean in C?):

static int j = 3;

j 的值将在您调用 main 函数时更新。你可以看到你的程序的输出:

3 2 1 克雷尼克雷尼克雷尼克雷尼

j 的值从3 递减到1,那么当j = 0 时,你不能访问for 循环,因为条件i &lt; j 不被接受,所以main() 是没有再次调用。

如果你想要一个无限代码,你从j 的声明中删除static,你的程序将永远不会停止。

【讨论】:

感谢您的解释,但我仍然不明白为什么在循环完成时它会打印 4 次“kreni”。这可能是一个愚蠢的问题,但这真的让我感到困惑。 @Petar 因为在最后一次调用main()j=0,所以你不能访问for循环打印j的值(printf("%d ", j--);被调用了3次),但是当j=0 时,您仍然可以打印kreni。这就是为什么您打印j 3 次但打印kreni 4 次的原因 我认为输出将是“3 kreni 2 kreni 1 kreni”,这让我感到困惑,它如何在循环中打印“3 2 1”,然后又打印了 4 次“kreni”。 函数在i=0i=1i=2时被调用。但是,不要忘记第一次调用main 是通过启动程序来调用的。 @Petar 每次调用main,你的程序回到main的第一行,直到j = 0,调用4次main会到达printf("%sn%c ", str, 'i');行。可以在最后的printf中打印j的值:printf("%sn%c, j = %d ", str, 'i',j);查看

以上是关于使用 main 函数进行递归的主要内容,如果未能解决你的问题,请参考以下文章

main函数递归

递归工作栈

Haskell 对字符串中的字符进行递归

关于java中的递归

用于从json菜单对象构建面包屑的递归函数

文法分析与递归下降分析