C 递归函数的意外输出
我是c编程新手。我编写了这个程序,希望打印C 递归函数的意外输出,c,C,我是c编程新手。我编写了这个程序,希望打印0,1,2,3,但它正在打印0,1,2,0。我在学习递归。为什么打印0,1,2,0请逐步解释 #include <stdio.h> void fun(int); typedef int (*pf) (int, int); int proc(pf, int, int); int main() { int a = 3; fun(a); return 0; } void fun(int n) { if (n &g
0,1,2,3
,但它正在打印0,1,2,0
。我在学习递归。为什么打印0,1,2,0
请逐步解释
#include <stdio.h>
void fun(int);
typedef int (*pf) (int, int);
int proc(pf, int, int);
int main()
{
int a = 3;
fun(a);
return 0;
}
void fun(int n)
{
if (n > 0)
{
fun(--n);
printf("%d,", n);
fun(--n);
}
}
#包括
虚无乐趣(int);
typedef int(*pf)(int,int);
int proc(pf,int,int);
int main()
{
INTA=3;
乐趣(a);
返回0;
}
虚无乐趣(int n)
{
如果(n>0)
{
乐趣(--n);
printf(“%d”,n);
乐趣(--n);
}
}
其中一个问题来自--n
。实际上,这不是一条指令,而是两条指令,--n
等于n=n-1
。因此,您永远不会打印从函数调用中获得的值,而是打印值小于1的值。这就是为什么你得到的最大值是2
然后,我让你自己找到解决问题的方法。正如@Iharob和@Zimano向您建议的,把它写在纸上会对您有所帮助。最简单的方法是,在调用任何fprintf之前,代码必须始终运行--n至少一次,因此无法打印起始值
要浏览注释中提到的代码,可以将函数作为“块”编写,如下面的伪代码中所示,约定在被调用的函数中改变更新后的值n,但当然不是相反。然后,流将如下所示:
{n:3--->2
{n:2--->1
{n:1--->0
{n:0 ---> return}
print(n=0)
n:0--->-1
{n:-1 ---> return}
}
print(n=1)
n:1--->0
{n:0 ---> return}
}
print(n=2)
n:2--->1
{n:1--->0
{n:0 ---> return}
print(n=0)
n:0--->-1
{n:-1 ---> return}
}
}
它确实打印出0,1,2,0。如果它打印出0,1,2,3
递归将永远不会结束!请你解释一下。。。。。。谢谢你能自己理解它,只需调用函数并在一张纸上写下n
的当前值。查看代码:void-fun(int-n){if(n>0){fun(--n);作为一个直到n==0
才打印任何内容的循环。当n
为0时,递归结束,首先到达print
。@IharobAlAsimi我尝试了,但没有得到它。谢谢你的回答。但我对这个程序感到困惑,我在纸上尝试了它,但没有得到它。我没有得到它最后是如何打印0的。请原谅请解释。。。