递归:
我参照大佬(帅她)的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;
}
中:(哦们再来两道练练手)
如题我们再来找三个条件:
#include
void 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: U\n",x);//把x套上 结束条件:x==1
if(x>2)put(x-2);//再把其余的放上去;
}
void out(int x){//这是拿出来的函数
if(x>2) out(x-2);//
printf("%d: D\n",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
/*
算法思路:1将 n-1个盘子先放到B座位上
2.将A座上地剩下的一个盘移动到C盘上
3、将n-1个盘从B座移动到C座上
*/
//函数声明
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.
两种数组嵌套法:
#include
int a[100];
int b[100];
int main(){
int i,j,k;
int n;
scanf("%d",&n);
for(i=0;i
2.
两层for去重法:
看题:
#include
int 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进制,然后再转化为对应的进制;
#include
int 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;
}