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)当中的两条语句是如何运行的(我对递归法比较糊涂)。 展开
{
if(*a)
{
fun(a+1);
printf("%c",*a);
}
}
main()
{
char s[10]="abcd";
fun(s);
printf("\n");
}
请问void fun(char *a)当中的两条语句是如何运行的(我对递归法比较糊涂)。 展开
3个回答
展开全部
首递归,s数组的地址被传入,首先判断地址指向的空间是否为空,在abcd的情况下,不为空,所以会反复递归调用自己4次,每次地址都+1,也就是指向下一个字母。(注意printf()一直没有执行,它只是把*a压入堆栈中,暂存起来)
当超过d时,内容为空,if不成立,此时,函数开始返回。返回时遇到的第一条语句是printf,第一次返回输出d,再次返回,输出c,依此类推,到a结束,整个函数都返回完成,回到main()中。
当超过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(),就表示递归调用全部结束了。
展开全部
if(*a)的意思是if('\0' != *a)
也就是当前字符非结束符的意思。
那么,如果已经是'\0'了,那就进不了这个if里面了,其实也就是这个递归调用的最底下一层了。
再看if里面的内容:
fun(a+1);
先递归调用,但是传入的地址是当前地址的下一个位置的地址。
printf("%c",*a);
再打印当前位置的地址里面的内容。
就这么一层一层递归调用下去,其实就是把源字符串逆向输出而已了~
也就是当前字符非结束符的意思。
那么,如果已经是'\0'了,那就进不了这个if里面了,其实也就是这个递归调用的最底下一层了。
再看if里面的内容:
fun(a+1);
先递归调用,但是传入的地址是当前地址的下一个位置的地址。
printf("%c",*a);
再打印当前位置的地址里面的内容。
就这么一层一层递归调用下去,其实就是把源字符串逆向输出而已了~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
亲,我给你我的q 2aa9aa09aa1aa18aa2aa9aa3a(中间的a去掉),你加我我告诉你,打字好辛苦也不知道如何回答你好呀
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询