有一道题目如下:
一个球从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();
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//结果截图如下
---------------------------------------------------------------------------------------------------------------------------------------
您的十分满意是我追求的宗旨。
您的一点建议是我后续的动力。