1. 百元百鸡问题。每只母鸡3元,每只公鸡4元,每只小鸡0.5元,如果花100元钱买100只鸡,请问有哪些可能?试编程输出所有的组合。【注:每种鸡的数量都可以为零】
源代码:
#include<stdio.h> int main() { int hen,rooster; printf("购买有以下这些组合:\n"); for(hen=0;hen<=33;hen++) { for(rooster=0;rooster<=25;rooster++) { if(hen*3+rooster*4+0.5*(100-hen-rooster)==100) { printf("母鸡:%d\t公鸡:%d\t小鸡:%d\t\n",hen,rooster,100-hen-rooster); } } } return 0; } |
2. 使用递归编写一个程序,求以下数列的前n项之和:
源代码:
#include<stdio.h> #include<math.h> double sum(int n) { if(n==1) return 1; else return sum(n-1)-pow(-1,n)*(1.0/n); } int main() { int x; printf("请输入数列的项数:\n"); scanf("%d",&x); double y=sum(x); printf("数列前%d项和为:\n%.3lf",x,y); return 0; } |
当n=10时,结果为 0.646 。
当n=15时,结果为 0.725 。
3. 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
输入整数a和b表示起点和终点,输出a到b可能的线路数。例如:输入1和2,输出1;输入3和6,输出3。
提示:寻找规律,使用递归实现。
源代码:
#include<stdio.h> #include<math.h> int route(int n){ if(n<=1) return 1; else return route(n-1)+route(n-2); } int main() { int x,a,b,t;//x表示输入的数据组数 printf("请输入数据的组数:\n"); scanf("%d",&x); while(x--) { printf("请输入起点和终点:\n"); scanf("%d%d",&a,&b); t=abs(a-b); printf("%d到%d可能的线路数为:%d\n",a,b,route(t)); } return 0; }
|
4. 编写一个程序,使用递归算法输出一个一维字符数组中所有字符的全排列,假设字符都不一样。例如{'a','b','c'}的全排列为(a,b,c), (a,c,b),(b,a,c), (b,c,a), (c,a,b), (c,b,a)。
源代码:
#include<stdio.h> void swap(char list[],int k,int i) { char t; t=list[k],list[k]=list[i],list[i]=t; } void perm(char list[],int k,int m) { int i; if(k==m){//只剩下一个元素 for(i=0;i<=m;i++){ printf("%c",list[i]); } printf("\n"); } else //还有多个元素,递归产生全排列 for(i=k;i<=m;i++){ swap(list,k,i); perm(list,k+1,m); swap(list,k,i); } } int main() { char list[]={'a','b','c'}; printf("此字符串的全排列为:\n"); perm(list,0,3); return 0; } |
5. 九数组分数。1, 2, 3...9 这九个数字组成一个分数,其值恰好为1/3,如何组合?编写程序输出所有的组合。
源代码:
#include<stdio.h> void test(int list[]) { int a = list[0]*1000 + list[1]*100 + list[2]*10 + list[3]; int b = list[4]*10000 + list[5]*1000 + list[6]*100 + list[7]*10 + list[8]; if(a*3==b) printf("%d / %d\n", a, b); } void swap(int list[],int k,int i) { int t; t=list[k],list[k]=list[i],list[i]=t; } void perm(int list[],int k,int m) { int i; if(k==m){//只剩下一个元素 test(list); return; } else //还有多个元素,递归产生全排列 for(i=k;i<=m;i++){ swap(list,k,i); perm(list,k+1,m); swap(list,k,i); } } int main() { int list[]={1,2,3,4,5,6,7,8,9}; printf("分数组合为:\n"); perm(list,0,9); return 0; } |
6. 使用递归编写一个程序,逆序输出一个正整数。例如输入1234,输出4321。
源代码:
#include<stdio.h> void reverseSort(int x) { if(x>0){ printf("%d",x%10); reverseSort(x/10); } } int main() { int num; printf("请输入一个整数:\n"); scanf("%d",&num); printf("逆序输出结果为:\n"); reverseSort(num); return 0; } |
7. 使用递归编写一个程序,计算一个正整数中所有数字之和。例如输入234,输出9。
源代码:
#include<stdio.h> int sum(int x) { int r; r=x%10; if(x>0){ return r+sum(x/10); } } int main() { int num; printf("请输入一个整数:\n"); scanf("%d",&num); printf("此正整数中所有数字之和为:\n"); printf("%d",sum(num)); return 0; } |
8. 使用递归编写一个程序,求一个正整数n的所有划分个数。例如,输入3,输出3;输入4,输出5。
源代码:
#include<stdio.h> int partition(int n,int m) { if((n<1)||(m<1)) return 0; if((n==1)||(m==1)) return 1; if(n<m) return partition(n,n); if(n==m) return partition(n,m-1)+1; return partition(n,m-1)+partition(n-m,m); } int main() { int num,result; printf("请输入一个整数:\n"); scanf("%d",&num); result=partition(num,num); printf("此整数划分的个数为:\n"); printf("%d",result); return 0; } |
9. 用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:【只需要输出铺放方案总数,不需要输出具体的铺放方案】
源代码:
#include<stdio.h> int pave(int n) { if(n<=1) return 1; else return pave(n-1)+pave(n-2); } int main() { int x; printf("请输入要铺的长方形的长度:\n"); scanf("%d",&x); printf("输出铺放方案总数:\n"); printf("%d",pave(x)); return 0; } |
10. 编写一个递归函数,返回一个字符串中大写字母的数目。例如,输入“AbcD”,输出2。
源代码:
#include <stdio.h> #define N 200 int count(char *ch) { int total=1; if(*ch=='\0') return 0; else { if(*ch>='A'&&*ch<='Z') return total+count(ch+1); else return count(ch+1); } } int main() { char *ch; ch=malloc(N+1); printf("请输入输入一行字符:\n"); gets(ch); printf("此字符串中大写字母有%d个\n",count(ch)); getchar(); } |
11. 使用递归编写一个程序实现汉诺塔问题,要求在输入圆盘数量之后,输出圆盘的移动步骤,输出格式示例如下:
第1步:1号盘从A柱移至B柱
第2步:2号盘从A柱移至C柱
……
源代码:
#include<stdio.h> int i=1; void move(int num,char x,char y) { printf("第%d步:%d号盘从%c柱移至%c柱\n", i++,num,x,y); } void hanoi(int n,char a,char b,char c) { if(n==1) move(1,a,c); else { hanoi(n-1,a,c,b); move(n,a,c); hanoi(n-1,b,a,c); } }
int main() { int num; char p,q,h; p='A',q='B',h='C'; printf("请输入圆盘数量:\n"); scanf("%d",&num); printf("圆盘的移动步骤为:\n"); hanoi(num,p,q,h); return 0; } |
当圆盘数量为4时,详细移动步骤为:
圆盘的移动步骤为: 第1步:1号盘从A柱移至B柱 第2步:2号盘从A柱移至C柱 第3步:1号盘从B柱移至C柱 第4步:3号盘从A柱移至B柱 第5步:1号盘从C柱移至A柱 第6步:2号盘从C柱移至B柱 第7步:1号盘从A柱移至B柱 第8步:4号盘从A柱移至C柱 第9步:1号盘从B柱移至C柱 第10步:2号盘从B柱移至A柱 第11步:1号盘从C柱移至A柱 第12步:3号盘从B柱移至C柱 第13步:1号盘从A柱移至B柱 第14步:2号盘从A柱移至C柱 第15步:1号盘从B柱移至C柱
|