gpt4 book ai didi

c - 为什么这个程序的输出是 312213444 而不是 3122134?

转载 作者:太空宇宙 更新时间:2023-11-04 06:57:02 26 4
gpt4 key购买 nike

在给出的代码中,我能想到的输出是 3122134,因为当 n=1 时,最后一个 printf 语句只执行一次。所以条件变为 1>1 这绝对不是真的,循环退出并执行最后一个 printf 语句。但原始输出是 312213444。为什么会这样?我哪里错了?请解释它的每个概念和实例?

 #include <stdio.h>
void count (int n)
{
static int d=1;

printf("%d", n);
printf("%d", d);
d++ ;
if(n>1)
count(n-1);
printf("%d", d);
}

void main ()
{
count(3);
}

最佳答案

重写您的 printf() 语句(并修复您的 main 声明),例如将其写入

#include <stdlib.h>
#include <stdio.h>

void count(int n)
{
static int d=1;

printf("A) n = %d\n", n);
printf("B) d = %d\n", d);
d++;
if (n>1)
count(n-1);
printf("C) d = %d\n", d);
}

int main(void)
{
count(3);

return EXIT_SUCCESS;
}

编译运行代码,看看输出结果,你就明白了。


一种可以帮助分解递归函数的技术是将几个递归调用分解为单独的函数。这里,main()调用了count(3),它做了一个递归调用count(2),它做了一个递归调用计数(1)。我们可以通过将函数重复三次来将这些递归调用更改为对单独函数的调用。不过,我们确实需要将 d 变量更改为全局变量,以便每个函数副本都使用相同的变量,而不是恰好具有相同名称的单独副本。

#include <stdlib.h>
#include <stdio.h>

int d = 1;

void count1(void)
{
int n = 1;
printf("count1(): A) n = %d\n", n);
printf("count1(): B) d = %d\n", d);
d++;
/* The following is never true, so
we comment it out:
if (n>1)
count0();
*/
printf("count1(): C) d = %d\n", d);
}

void count2(void)
{
int n = 2;
printf("count2(): A) n = %d\n", n);
printf("count2(): B) d = %d\n", d);
d++;
if (n>1)
count1();
printf("count2(): C) d = %d\n", d);
}

void count3(void)
{
int n = 3;
printf("count3(): A) n = %d\n", n);
printf("count3(): B) d = %d\n", d);
d++;
if (n>1)
count2();
printf("count3(): C) d = %d\n", d);
}

int main(void)
{
count3();

return EXIT_SUCCESS;
}

在这种特殊情况下,解开递归函数应该有助于理解控制流。 (具体来说,当您调用另一个函数并且函数返回时,函数调用后的语句中的调用方继续执行。)

关于c - 为什么这个程序的输出是 312213444 而不是 3122134?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43086652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com