一个球从100米高度自由落下,每次落地后反弹回原来高度的一半

54 篇文章 0 订阅
20 篇文章 0 订阅

有一道题目如下:

            一个球从100米的高度自由落下,每次落地后反弹回原来高度的一半,然后再落下,求它在第10次落
地时,共经过多少米?第10次反弹的高度是多少?

答案1:路程:299.8046875 高度:0.09765625
答案2:sm=299.60938, h=0.097656625

以上两个答案,第一个是老师给的,第二个是从网上找的。我算出的答案跟以上两个答案也不尽相同,

不过差别不大,我想这是由于不同的编译器的精度不同导致的吧。

---------------------------------------------------------------------------------------------------------------------------------------------------------

下面是我的分析及解题过程,画图分析如下:


上面这幅图,我只画了球5次落地的情况,后面的落地情况是一样的,以此类推即可。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

由上面这幅图可知:

第一次落地经过的路程,为落地时的高度。

第二次落地经过的路程,为落地时的高度乘以2,再加上前面走过的路程。

第三次落地经过的路程,为落地时的高度乘以2,再加上前面走过的路程。

第四次落地经过的路程,为落地时的高度乘以2,再加上前面走过的路程。

第五次落地经过的路程,为落地时的高度乘以2,再加上前面走过的路程。

.....

第n次落地经过的路程,为落地时的高度乘以2,再加上前面走过的路程。

......

第一次反弹的高度,为落地时高度的一半。

第二次反弹的高度,为落地时高度的一半。

第三次反弹的高度,为落地时高度的一半。

第四次反弹的高度,为落地时高度的一半。

第五次反弹的高度,为落地时高度的一半。

......

第n次反弹的高度,为落地时高度的一半。

------------------------------------------------------------------------------------------------------------------------------------------------------------

由以上分析可知,除了第一次落地的情况不同之外,其它的落地情况都类似,只是高度变化而已。

因此我们可以用递归来解决以上问题。

该递归函数的设计,我们需要3个参数:

一个是落地时的高度h,一个是落地的次数n,一个是球前面n-1次走过的路程d

递归的出口为n等于10

-------------------------------------------------------------------------------------------------------------------------------------------------------------

我写的例子代码如下:

#include <iostream>
using namespace std;

//求球第n次落地经过的距离,和第n次反弹的高度
void Ball(double h,int n,double d)
{
	double sum=d;//前面n-1次落地经过的距离

	if(10==n)//递归出口
	{
		cout<<"\n第10次落地经过的距离:"<<sum+h*2<<endl;
		cout<<"第10次反弹的高度:"<<h/2<<endl;
		return;
	}
	if (1==n)
	{
		sum=100;//第一次落地经过的距离
	}
	else
	{
		sum=sum+h*2; //或sum+=h*2;
	}
	printf("\n第%d次落地的高度%f\n",n,h);

	//下一次落地
	Ball(h/2,n+1,sum);
}


void main(void)
{
	
	Ball(100,1,0);
	cin.get();
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//结果截图如下


---------------------------------------------------------------------------------------------------------------------------------------


您的十分满意是我追求的宗旨。

您的一点建议是我后续的动力。









  • 19
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

friendan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值