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