目录
A 递归求和
题目描述
使用递归编写一个程序,求:
S(n)=1-1/2+1/3-1/4+1/5-1/6+......
输入
多组数据输入,每组输入一个正整数n。
输出
输出S(n)的计算结果(精确到小数点后六位)。
样例输入 Copy
1
样例输出 Copy
1.000000
分析:注意要是小数, n为奇数时,为加数 即为正n为偶数时,为减数 即为负所以设一个 z=0来加 再总结出一个多项式 被加即可多项式为 pow(-1,i-1)*(1.0)/n;
代码实现:c语言#include<stdio.h> #include <stdlib.h> int main (){ int n; while(~scanf("%d",&n)) { digui(n,0); } return 0; } void digui(int n,double z){ if(n>0){ double x=1.0/n; if(n%2==1) digui(n-1,z+x); if(n%2==0) digui(n-1,z-x); } else { printf("%lf\n",z); } }
B 倒序输出
题目描述
使用递归编写一个程序,逆序输出一个非负整数。例如输入1234,输出4321(不含前导0)。
输入
多组输入,每组输入一个非负整数。
输出
逆序输出结果,每个结果占一行。
样例输入 Copy
12
1230
0
样例输出 Copy
21
321
0
分析:题目是输入一个非负整数 所以不仅仅要考虑 1234 2345 等等这些正整数 还要考虑 0;其中样例输入的 1230 样例输出 321,我们也要稍作处理所以总体上用递归写的话要容易很多我们先用递归的方法求得是1234 2345这些正整数的解假设输入的正整数是 n那么递归分为两步:一步是 n%10 求得最后一位数 然后输出。二步是 返回 n/10 继续递归 求 最后一位数然后假如这个整数是末尾为0的 1230 123000 这些正整数怎么办嘞我们可以在递归的参数里面多定义一个参数变量 sign 来标识,设sign初始值 为0if sign==0 && n%10 ==0 我们就不输出,直接进行n/10 递归即可 可看 标记2else 我们就 输出 n%10 同时 令 sign=1 再递归 可看 标记3可能有点抽象具体看代码实现
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ int n; while(~scanf("%d",&n)){ if(n==0) { printf("0"); printf("\n"); } else{ digui(n,0); printf("\n"); } } return 0; } void digui (int n,int sign){ if(n>0) { int x=n%10; if(x==0&&sign==0) digui(n/10,sign); // 标记2 else{ sign=1; // 标记3 printf("%d",x); digui(n/10,sign); // 标记3 } } }
C 递归计数
题目描述
编写一个递归程序,返回一个字符串中大写字母的数目。例如,输入“AbcD”,输出2。
输入
多组输入,每组包括一个仅由大小写字母组成的字符串。
输出
输出字符串中出现大写字母的数目。
样例输入 Copy
AbcD
样例输出 Copy
2
分析:这个题比较简单了,看代码即可
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ char a[100]; while(~scanf("%s",a)){ int length=strlen(a); digui(a,0,0,length); } } void digui (char a[],int i,int count,int length){ if(i<length) { if(a[i]>='A'&&a[i]<='Z') digui(a,i+1,count+1,length); else digui(a,i+1,count,length); } if(i==length) printf("%d\n",count); }
D kimi数列
题目描述
Kimi最近在研究一个数列:
* F(0) = 7
* F(1) = 11
* F(n) = F(n-1) + F(n-2) (n≥2)
Kimi称之为Kimi数列。请你帮忙确认一下数列中第n个数是否是3的倍数。
输入
输入包含多组数据。
每组数据包含一个整数n,(0≤n≤30)。
输出
对应每一组输入有一行输出。
如果F(n)是3的倍数,则输出“Yes”;否则输出“No”。
样例输入 Copy
0
1
2
3
4
5
样例输出 Copy
No
No
Yes
No
No
No
分析:我们可以先用递归求出 f(n) 的值 , 再判断是否为3的倍数具体可看代码分析(这个递归求和属于基本东西,理解记忆)
代码分析:c语言#include <stdio.h> #include <stdlib.h> int main (){ int n; while (~scanf("%d",&n)){ three(digui(n)); } return 0; } int digui (int n){ if(n==0) return 7; if(n==1) return 11; if(n>1) return digui(n-1)+digui(n-2); } void three(int n){ if(n%3==0) printf("Yes\n"); else printf("No\n"); }
E 蜂房
题目描述
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
输入
多组数据输入,每组数据包含两个正整数a, b,且 a<b。
输出
蜜蜂从蜂房a爬到蜂房b的可能路线数。
样例输入 Copy
1 2
3 4
样例输出 Copy
1
1
分析: 这个题其实和上kimi数列差不多 ,只是起始地点不一样了而已。稍作探讨:我们假设 起点为p, 终点为q根据蜂房图形可知,第一 p肯定是要小于q滴第二 if q - p==1 则 return 1第三 if q - p==2 则 return 2第四 if q - p >2 则 return digui(p,q-1)+digui(p,q-2);(就是前面两个蜂房的和)即 digui(p,q)等于 digui(p,q-1)加上 digui(p,q-2);具体请看代码实现
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ int p,q; while(~scanf("%d %d",&p,&q)){ int s=digui(p,q); printf("%d",s); printf("\n"); } return 0; } int digui (int p,int q){ if(p<q){ if(q-p==1) return 1; if(q-p==2) return 2; else { return digui(p,q-1)+digui(p,q-2); } } }
F 骨牌覆盖
题目描述
用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:
输入
多组测试用例,每一组是一个正整数。
输出
每组输出占一行。
只需要输出铺放方案总数,不需要输出具体的铺放方案。
样例输入 Copy
3
样例输出 Copy
3
分析:和前面的题类似 此时的数都是前面 两个数的和每一次长度为n的骨牌 它的最后一次填完 都可以看作两种填完 要么是 占一横格的 竖着要么是 占两横格的 横着所以递归的话 就是 return digui(n-2)+digui(n-1)具体看代码实现
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ int n; while(~scanf("%d",&n)){ int z=digui(n); printf("%d",z); printf("\n"); } return 0; } int digui(int n){ if(n>0){ if(n==1) return 1; if(n==2) return 2; if(n>2) return digui(n-1)+digui(n-2); } }