C语言问题,求详解!!!有分!

void main()
{ int w=5;
void fun(int);
fun(w);
printf("\n");
}
void fun(int k)
{if (k>0) fun(n-1);
printf("%d",k);
}

求详细过程解答,答案是012345,为什么?
fun(k-1)不好意思打错了,其他没打错。

这个是一个递归算法,fun函数不断的调用自身,最开始k=5,于是调用fun(4),但是fun(5)还没执行完,fun(4)里继续调用fun(3),直到fun(0)时,直接输出0,然后函数返回上层,即fun(1),而fun(1)已经执行完if语句,直接输出1,同理,函数不断返回上层,最上层的函数是fun(5),所以直到输出5后,整段函数执行完毕
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-24
#include<stdio.h>
void main()
{  
int w=5;
void fun(int);
fun(w);//调用fun子函数,传递5
printf("\n");
}
void fun(int k)
{
if (k>0)  //判断传递的值,如果大于0则调用自身
{
fun(k-1);//递归调用
}
else
{
return 0;//加上这几句就会输出1,2,3,4,5.因为程序fun(0)时没返回而是执行下面的语句,于是0也进行了输出
}
/*
*fun(5),fun(4),fun(3),fun(2),fun(1),fun(0),当到了fun(0)时条件才不满足大于0,才输出,0,1,2,3,4,5
*/
printf("%d",k);
}

追问

为什么有fun(5)呢?不是k-1吗?变成fun(4)然后输出K=5,为什么还要回去?可以详细解释下吗?为了考二级暑假自学C呢,函数这点有的地方看不懂。。。。。

追答

自身调用自身所以并没执行printf而是再次执行了自身,如果不理解你可以尝试单步调试

追问

哥哥 return 0 的意思是返回上一级吗就是返回fun(1)? 然后执行输出? return 1可以用在这里吗?

追答

return 0是返回就不执行fun(0)的输出,这儿return 多少都没关系。你可以return 100,她的作用是不执行fun(0)的输出而已
-----------
fun(5){
fun(4){
fun(3){
fun(2){
fun(1){
fun(0){
return 0
}
printf..1
}
printf..2
}
printf..3
}
printf..4
}
printf..5
}

追问

那个if语句不是如果大于0则调用自身吗?最后=0时为什么还调用了?5>0,调用 4也调用,到0了应该不调用啊?

追答

到0没返回就会调用,所以要用return

追问

谢谢,明白了,打了这么多,多送5分吧,谢谢你!!!

追答

不用

本回答被提问者和网友采纳
第2个回答  2013-07-24
程序有错误吧。。
void fun(int k)
{if (k>0) fun(n-1);//这里的n-1应该是k-1的。。
printf("%d",k);
}
这是个迭代程序,对于初始值w而言,就会迭代w步,每次在进行fun()运算,直到输入的值为0,然后再依次打印到屏幕上追问

能在详细点,算法写下可以不

第3个回答  2013-07-24
fun(n-1);
printf("%d",k);
关键在这里,是先调用自身,在打印
所以啊,那么就是在最后没法再调用自身的时候打印k,这是k是0,接着一层一层的返回到上一个调用它的地方,结束调用,打印
那么就是从小到大了追问

那是从If判断那里开始调用?先调用fun(5),然后判断变成了4,在返回if判断然后调用?

追答

这个子函数只有两句话,一个是如果k>0则调用本身(并且k减去1),下面一句和上面的if没关系,只是打印当前k的值

当调用到k是0了,那么就不在调用本身,也就是if包含的语句不执行了,那么就执行下面的打印k
接着结束子函数,回到上一个调用的地方,那么接着就是执行打印了
以此类推,就是打印,结束调用。最后返回main,结束程序

追问

当k=0时,不符合if了 那么不调用本身了,为什么输出还有0呢?应该输出12345啊

追答

我不是说了,if和printf没有任何关系,只是上下文而已
k=0只是不再调用函数而已,printf还是要执行的,知道没有
所以还是要打印出0的

第4个回答  2013-07-24
递归调用,直到k=0的时候,才会执行printf("%d",k);追问

那为什么输出6个数啊?还有怎么判断是不是递归啊?

相似回答