c语言中fun()函数递归

void fun(char *a)
{
if(*a)
{
fun(a+1);
printf("%c",*a);
}
}

main()
{
char s[10]="abcd";
fun(s);
printf("\n");
}

请问void fun(char *a)当中的两条语句是如何运行的(我对递归法比较糊涂)。

首递归,s数组的地址被传入,首先判断地址指向的空间是否为空,在abcd的情况下,不为空,所以会反复递归调用自己4次,每次地址都+1,也就是指向下一个字母。(注意printf()一直没有执行,它只是把*a压入堆栈中,暂存起来)
当超过d时,内容为空,if不成立,此时,函数开始返回。返回时遇到的第一条语句是printf,第一次返回输出d,再次返回,输出c,依此类推,到a结束,整个函数都返回完成,回到main()中。追问

我能理解到的是fun(a+1),意味着*a从a-b-c-d-null,我不理解的是,当超过d时,内容为空,if不成立,连这个循环都不进了,还怎么执行printf语句啊,怎么会有栈形成呢,不过这倒是一个出栈的过程

追答

函数调用有返回这个过程。在d之前,一直都没有机会执行printf啊,不断自身调用,这样就形成递归了。
每次函数调用,都会一系列push XX,这是一种将参数压入堆栈的过程,这叫“保存现场”。函数完成时,就会retn,将堆栈里保存的内容恢复回来,这叫“恢复现场”。
递归一直没机会恢复现场,开始时是不断保存现场,在达到结束条件后,再依次恢复现场。直到回到main(),就表示递归调用全部结束了。

追问

追答

应该这样理解:
1-fun('a')
2-fun('b')
3-fun('c')
4-fun('d')
if不成立,函数开始返回
4-printf('d) 这是4-fun里的printf,以下类推
3-printf('c')
2-printf('b')
1-printf('a')
结束fun,回到main

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-17
if(*a)的意思是if('\0' != *a)
也就是当前字符非结束符的意思。
那么,如果已经是'\0'了,那就进不了这个if里面了,其实也就是这个递归调用的最底下一层了。

再看if里面的内容:
fun(a+1);
先递归调用,但是传入的地址是当前地址的下一个位置的地址。
printf("%c",*a);
再打印当前位置的地址里面的内容。

就这么一层一层递归调用下去,其实就是把源字符串逆向输出而已了~
第2个回答  2014-03-17
亲,我给你我的q 2aa9aa09aa1aa18aa2aa9aa3a(中间的a去掉),你加我我告诉你,打字好辛苦也不知道如何回答你好呀
相似回答