c语言中fun()函数递归

voidfun(char*a){if(*a){fun(a+1);printf("%c",*a);}}main(){chars[10]="abcd";fun(s);prin... 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)当中的两条语句是如何运行的(我对递归法比较糊涂)。
展开
 我来答
若彤小站
2014-03-17 · TA获得超过133个赞
知道小有建树答主
回答量:149
采纳率:0%
帮助的人:107万
展开全部
首递归,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(),就表示递归调用全部结束了。
云淡风轻in苏州
2014-03-17 · TA获得超过599个赞
知道小有建树答主
回答量:418
采纳率:0%
帮助的人:552万
展开全部
if(*a)的意思是if('\0' != *a)
也就是当前字符非结束符的意思。
那么,如果已经是'\0'了,那就进不了这个if里面了,其实也就是这个递归调用的最底下一层了。

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

就这么一层一层递归调用下去,其实就是把源字符串逆向输出而已了~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
会点技术的小子
2014-03-17 · TA获得超过528个赞
知道小有建树答主
回答量:356
采纳率:0%
帮助的人:283万
展开全部
亲,我给你我的q 2aa9aa09aa1aa18aa2aa9aa3a(中间的a去掉),你加我我告诉你,打字好辛苦也不知道如何回答你好呀
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式