哈哈,来凑个热闹了。。。欢迎来踩。。。
根据“今天碰到一道比较有趣的面试题,大家来探讨一下”的文章,稍微做了一下,没想到这么简单的东西竟花了我一个小时。
不够在做的过程中,却给了我另外一个思路,大家知道,这道题是用递归算法来做的,而递归肯定会需要一个终点值,或者更准确的
说是让递归结束的条件。而在这题中,有可能会有两种这样的结束条件。
1). 两车的距离小于多少时相当于两车相遇了 (单位公里)
2) . 小鸟在两车之间单向飞行的时间小于多少时间时相当于两车相遇了(单位 小时)
因此会有两种解法,一种是根据相距距离来进行递归,一种是根据小鸟飞行时间进行递归
Code
class Program
{
static void Main(string[] args)
{
double exactDistance = 0.000000001;
double exactTime = 0.00000001;
Console.WriteLine("if Distance: ");
Console.WriteLine(birdRunUseDistance(exactDistance).ToString());
Console.WriteLine("if Time: ");
Console.WriteLine(birdRunUseDistance(exactTime).ToString());
Console.ReadKey();
}
/// <summary>
/// 根据距离
/// </summary>
/// <param name="exactDistance">当两车正面距离小于多少时相当于两车相遇</param>
/// <returns></returns>
static int birdRunUseDistance(double exactDistance)
{
int times = 0;
int Ta = 15; //车A速
int Tb = 20; //车B速
int bird = 30; //鸟速
double Length = 1000; //初始两地距离
bool p = true; //方向 甲到已为true 相反则为false;
while (Length > exactDistance)
{
double t = 0;
if (p)
{
t = Length / (Tb + bird);
}
else
{
t = Length / (Ta + bird);
}
Length = Length - t * (Ta + Tb);
p = !p;
times = times + 1;
}
return times;
}
/// <summary>
/// 根椐时间
/// </summary>
/// <param name="exactTime">时间精度(当小鸟在两车之间单程飞行的时间小于多少时就相当于两车相遇了)</param>
/// <returns></returns>
static int birdRunUseTimes(double exactTime)
{
int times = 0;
int Ta = 15; //车A速
int Tb = 20; //车B速
int bird = 30; //鸟速
double Length = 1000; //初始两地距离
bool p = true; //方向 甲到已为true 相反则为false;
double totalTime=Length/(Ta+Tb);
double birdFlyTotalTime = 0;
while ((totalTime - birdFlyTotalTime) > exactTime)
{
double t = 0;
if (p)
{
t = Length / (Tb + bird);
}
else
{
t = Length / (Ta + bird);
}
birdFlyTotalTime = birdFlyTotalTime + t;
p = !p;
times = times + 1;
}
return times;
}
}