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)当中的两条语句是如何运行的(我对递归法比较糊涂)。
我能理解到的是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