递归:
我参照大佬(帅她)的csdn;可以把处理递归分为3个步骤:
1.明确你这个函数想要干什么
2.寻找递归结束条件
3.找出函数的等价关系式
详细的可以看这篇文章
(35条消息) 为什么你学不会递归?告别递归,谈谈我的经验_帅地-CSDN博客_递归
我先列举几道题:
易:
如这道题:
我们就可以用上面的步骤:
1.这个函数的作用是?
很明显这是求交错幂级数的部分和的函数
2.结束条件:
当递归到n==1时:sum==x
3.等价条件:(缩小n的范围)
sum=x-(x*fn(x),n-1);
上代码:
double fn( double x, int n ){ double sum=0; if(n==1){ sum=x; } else{ sum=x-x*fn(x,n-1);//主要要推出跟上一项的与本想的关系式; } return sum; }
中:(哦们再来两道练练手)
如题我们再来找三个条件:
#includevoid out(int x);//1~i-2不在杆上,i-1在杆上,i可装上或取下 void put(int x){//这是放上去的函数 if(x>1)put(x-1);//把x之前的环放上 if(x>2)out(x-2);//再把除离x最近的留下 printf("%d: Un",x);//把x套上 结束条件:x==1 if(x>2)put(x-2);//再把其余的放上去; } void out(int x){//这是拿出来的函数 if(x>2) out(x-2);// printf("%d: Dn",x);// if(x>2) put(x-2);// if(x>1) out(x-1);// } int main(){ int n; char a; scanf("%d %c",&n,&a); if(a=='U'){ put(n); } else if(a=='D'){ out(n); } return 0; }
汉吉塔:
求n层汉吉塔从a到b的移动次数:
#include#include //函数声明 int sum=0;//次数 void move(char x, char y); void hannuo(int n,char one ,char two,char three) { if(n==1)move(one, three); //递归截止条件 else { hannuo(n-1,one ,three,two);//将 n-1个盘子先放到B座位上 move(one,three);//将A座上地剩下的一个盘移动到C盘上 hannuo(n-1,two,one,three);//将n-1个盘从B座移动到C座上 } } void move(char x,char y) { printf("%c--->%c",x,y) sum++; } int main() { int n; printf("input your number"); scanf("%d",&n); hannuo(n,'A','B','C'); printf("n%d",sum); return 0; }
指针数组:
char *arr[4] = {"hello", "world", "shannxi", "xian"}; //arr就是我定义的一个指针数组,它有四个元素,每个元素是一个char *类型的指针,这些指针存放着其对应字符串的首地址。
看题:
int max_len( char *s[], int n ){ int i; int a[1000010]; for(i=0;imax){ max=a[i]; } } return max; }
判断完全平方数:
看题:
输出样例: cnt = 6
int IsTheNumber ( const int N ){ int a[10]={0}; int n=N; int f=0; int i,g; while(n){//把数字转为数组; g=n%10; a[g]++; n=n/10; } for(i=0;i<10;i++){ if(a[i]>=2){ f=1; } } if(N>=100&&sqrt(N)==(int)sqrt(N)&&f==1){//sqrt(N)==(int)sqrt(N)判断是完全平方数; return 1; } else { return 0; } }
去重数组的两种方法:
1.
两种数组嵌套法:
#includeint a[100]; int b[100]; int main(){ int i,j,k; int n; scanf("%d",&n); for(i=0;i 2.
两层for去重法:
看题:
#includeint fa[42]; int fb[42]; int c[42]; int main(){ int a[21]; int b[21]; int n1,n2,i,j; scanf("%d",&n1); for(i=0;i 无n无文件结尾但有其他符号区别的输入:
看题:
#include#include int n[1000]; int m[1000]; int main(){ int j=0; while(scanf("%d",&n[j++])){//学到了 可以写到周总结里; char e=getchar(); if(e!=','){ break; } } int i,k=0; for(i=0;i 进制转化:
看题:
思路:把所有的数字先转化为10进制,然后再转化为对应的进制;
#includeint b[1000010]; int main() { int n,a[100010]; int sum=0; char g; scanf("%d",&n); getchar(); while((g=getchar())!='n'){ if(g>='0'&&g<=('0'+n-1)){//先把数字由字符转化为10进制; sum = sum * n + (g - '0'); } } int t; scanf("%d",&t); if(t==10){ printf("%d",sum); } else{ int i=0; while(sum){ b[i++]=sum%t;//再转化为对应进制; sum=sum/t; } for(i=i-1;i>=0;i--){ printf("%d",b[i]); } } return 0; } 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)