递归:
1、弹球距离
设有一个球从高度为h米的地方落下,碰到地面后又弹到高度为原来p倍的位置,然后又落下,再弹起,再落下…。请编写函数求初始高度为h的球下落后到基本停下来(高度小于给定阈值TOL)时在空中所经过的路程总和。注意:当弹起的高度小于裁判程序定义的常数TOL时,弹起的距离不计算在内。
输入:输入球的初始高度h和球弹起高度与弹起前落下高度的比值p
输出:输出球下落后到基本停下来时在空中所经过的路程总和dist
优化目标:无
#include#define TOL 1E-3 double dist( double h, double p ); int main() { double h, p, d; scanf("%lf %lf", &h, &p); d=dist(h,p); printf("%.6fn", d); return 0; } double dist(double h, double p) { double rh=p*h; if(rh 2、输入一个非负整数,返回组成它的数字之和
输入:输入一个非负整数n
输出:输出组成n的数字之和
优化目标:无#include#include int DigitSum(n) { if (n>0) { return n%10+DigitSum(n/10); } else return 0; } int main() { int n; scanf("%d",&n); printf("%dn", DigitSum (n)); return 0; } 3、递归实现strlen
输入:输入一个字符串p
输出:输出字符串p的长度
优化目标:无#includeint length(char *str) { if (*str==' ') { return 0; } return 1+length(str+1);//str+1指针下移 } int main() { char *p=""; scanf("%s",p); printf("%dn", length(p)); return 0; } 4、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
输入:输入天数i
输出:输出第i天有多少桃子
优化目标:无#include//函数返回第n天的桃子数 int num(int n){ if(n==10) return 1; else return (num(n+1)+1)*2; } int main(){ int i; scanf("%d",&i); printf("第一天共摘了多少: %d",num(i)); return 0; } 5、汉诺塔
输入:输入盘子数量num
输出:输出移动步骤
优化目标:无#includevoid hannuo(int num,char one,char two,char three); void move(char a,char b); int main(){ int num; printf("input the number of disks:"); scanf("%d", &num); printf("the step:n"); hannuo(num,'A','B','C'); } void hannuo(int num,char one,char two,char three){ if(num==0){ return; } else{ hannuo(num-1,one,three,two);//n-1个盘子从one移动到two,借助three move(one,three);//一个盘子从one移动到three hannuo(num-1,two,one,three);//n-1个盘子从two移动到three,借助one } } void move(char a,char b){ printf("%c->%cn",a,b); } 总结:今天找了一些递归的题练习,也复习了之前练习的递归题,递归还是比较容易理解。明天计划练习顺序表的题。



