/*
本程序是求下面关于傻子坐飞机的问题:
* 100个人排队乘坐有100个座位的飞机,正常情况时每个都都会对号入坐,但是,
* 第一个上飞机的是个傻子,他随机坐了一个位子,接下来的人上飞机时,如果
* 自己座位被人坐了就会随机找个座位坐下,否则就坐自己坐位。问题:最后一
* 个上飞机的人坐到自己座位的概率是多少?? */
using System;
namespace Stupid
{
class Program
{
/// <summary>
/// 用来保存已经计算过的结果
/// </summary>
private double [] result;
public Program()
{
result = new double [ 100 ];
}
/// <summary>
/// 求最后一个上飞机的人坐到自己座位的概率
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public double F( int n)
{
double s = 0 ;
double f = 0 ;
if (n == 2 )
{
return 0.5 ;
}
else
{
for ( int i = 2 ; i < n; i ++ )
{
if (result[i - 1 ] != 0 )
s += result[i - 1 ];
else
{
f = F(i);
s += f;
result[i - 1 ] = f;
}
}
return (s + 1 ) / ( double )(n);
}
}
/// <summary>
/// 程序入口
/// </summary>
/// <param name="args"></param>
static void Main( string [] args)
{
double starttime, spendtime;
starttime = System.DateTime.Now.Ticks;
Console.WriteLine( " Result={0} " , new Program().F( 100 ));
// 计算所需时间
spendtime = (System.DateTime.Now.Ticks - starttime) / 1000000.0 ;
Console.WriteLine( " 计算所需时间:{0:f3} " , spendtime);
Console.Read();
}
}
}
* 100个人排队乘坐有100个座位的飞机,正常情况时每个都都会对号入坐,但是,
* 第一个上飞机的是个傻子,他随机坐了一个位子,接下来的人上飞机时,如果
* 自己座位被人坐了就会随机找个座位坐下,否则就坐自己坐位。问题:最后一
* 个上飞机的人坐到自己座位的概率是多少?? */
using System;
namespace Stupid
{
class Program
{
/// <summary>
/// 用来保存已经计算过的结果
/// </summary>
private double [] result;
public Program()
{
result = new double [ 100 ];
}
/// <summary>
/// 求最后一个上飞机的人坐到自己座位的概率
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public double F( int n)
{
double s = 0 ;
double f = 0 ;
if (n == 2 )
{
return 0.5 ;
}
else
{
for ( int i = 2 ; i < n; i ++ )
{
if (result[i - 1 ] != 0 )
s += result[i - 1 ];
else
{
f = F(i);
s += f;
result[i - 1 ] = f;
}
}
return (s + 1 ) / ( double )(n);
}
}
/// <summary>
/// 程序入口
/// </summary>
/// <param name="args"></param>
static void Main( string [] args)
{
double starttime, spendtime;
starttime = System.DateTime.Now.Ticks;
Console.WriteLine( " Result={0} " , new Program().F( 100 ));
// 计算所需时间
spendtime = (System.DateTime.Now.Ticks - starttime) / 1000000.0 ;
Console.WriteLine( " 计算所需时间:{0:f3} " , spendtime);
Console.Read();
}
}
}
采用以上算法(只是对我原来算法的一个改进,当然如果能够改成非递归算法那就更好)
当n=100时,只需0.1秒左右的时间就可以算出来.