C语言(十五)

递归:
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);
}

总结:今天找了一些递归的题练习,也复习了之前练习的递归题,递归还是比较容易理解。明天计划练习顺序表的题。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将一个五位数逆序输出,可以使用C语言编写一个程序来实现。首先,我们需要从用户那里获取一个五位数。接下来,我们将使用除法和取余操作符来分离每一位数字,并以逆序的方式打印出来。 具体步骤如下: 1. 首先,声明一个整型变量number来接收用户输入的五位数。可以使用scanf函数来实现,如下所示: ```c int number; scanf("%d", &number); ``` 2. 接下来,我们使用取余操作符取出number的个位数字,并将其打印出来。之后,将number除以10,将其变为四位数,以类似的方式继续取得并打印出十位、百位、千位和万位数字。 ```c int digit; digit = number % 10; printf("%d", digit); number /= 10; digit = number % 10; printf("%d", digit); number /= 10; digit = number % 10; printf("%d", digit); number /= 10; digit = number % 10; printf("%d", digit); number /= 10; digit = number % 10; printf("%d", digit); ``` 3. 最后,我们可以输出一个换行符,以美化输出。 ```c printf("\n"); ``` 最终的完整代码如下: ```c #include <stdio.h> int main() { int number; scanf("%d", &number); int digit; digit = number % 10; printf("%d", digit); number /= 10; digit = number % 10; printf("%d", digit); number /= 10; digit = number % 10; printf("%d", digit); number /= 10; digit = number % 10; printf("%d", digit); number /= 10; digit = number % 10; printf("%d", digit); printf("\n"); return 0; } ``` 这样,当用户输入一个五位数后,程序将会以逆序的方式输出各位数字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值