对于C语言的递归还是懵懵懂懂,能帮我分析一下这段代码的执行流程吗,尽量详细一点?
#include"stdio.h"
main()
{ char s[80];
int i,j;
gets(s);
for(i=j=0;s[i]!='\0';i++)//这里只有i++,j++在下面,j不随for循环自加1
if (s[i]!='c')
s[j++]=s[i];//每有一个不为'c'的单位出现,j自加1;并且该单位的值,重新赋值给数组s,从s[0]开始,因为j初值为0
else//这加个else便于理解,等价于源代码;该单位的值为'c',就向该单位赋予空值;
s[j]='\0';
puts(s);
}//例如输入abcdec,分别占据s[0]='a',s[1]='b',s[2]='c',s[3]='d',s[4]='e',s[5]='c';
//s[0](j==0),s[1](j==1)还是赋值在原位,
//s[2](这if不成立,j不自加1)s[2]='\0',
//s[3]不为'c'(j==2),所以'd'就赋给了s[2];
//s[4](j==3),'e'赋予s[3],
//s[5]='\0',赋空值;
一共执行21次,分别是20~0,即0+1+2...+20之和.
这段代码的执行过程
主函数main调用fun5(4)
进入fun5(4) n==4,s=4+fun5(3)
进入fun5(3) n==3,s=3+fun5(2)
进入fun5(2) n==2,s==2,打印2,2--------s
返回 fun5(3) n==3,s=3+fun5(2)=3+2=5,打印3,5--------s
返回 fun5(4) n==4,s=4+fun5(3)=4+5=9,打印4,9--------s
返回main函数,打印9
完整的C语言程序如下
#include <stdio.h>
long fun5(int n){
long s;
if((n==1)||(n==2))
s=2;
else
s=n+fun5(n-1);
printf("%d
",n);
printf("%d--------s
",s);
return(s);
}
main(){
long x;
x=fun5(4);
printf("%ld",x);
}
fun5 函数,你一步一步看,
如果 n为1或者2时会返回 2
如果 n为其他时会返回 n + fun5(n-1)
那么我们可以写
fun5(1) = 2
fun5(2) = 2
fun5(3) = 3 + fun5(2) = 3 + 2 = 5
fun5(4) = 4 + fun5(3) = 4 + 3 + fun5(2) = 4 + 3 + 2 = 9
.....
你可以看到,每个等号调用fun5(n-1)函数
对于大的n会一步一步递归调用到小的n,直到n为2给出最后结果。
这就是递归。
你这个应该有个退出的机制,如果没有,那,一直加下去了,可以递归一次后。判断s的值是否符合某个条件,比如大于几小于几,然后再返回?
递归路线图:
f(4)= 4 + f(3)
f(3) = 3 + f(2)
f(2) = 2
反向带入
f(3) = 3+f(2)=3+2=5
f(4)=4+f(3)=4+5=9
结束
对于C语言的递归还是懵懵懂懂,能帮我分析一下这段代码的执行流程吗...
答:这段代码的执行过程 主函数main调用fun5(4)进入fun5(4) n==4,s=4+fun5(3)进入fun5(3) n==3,s=3+fun5(2)进入fun5(2) n==2,s==2,打印2,2---s 返回 fun5(3) n==3,s=3+fun5(2)=3+2=5,打印3,5---s 返回 fun5(4) n==4,s=4+fun5(3)=4+5=9,打印4,9--...