使用 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 < 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=0
、i=1
和i=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 函数进行递归的主要内容,如果未能解决你的问题,请参考以下文章