博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

循环结构练习题目5

Posted on 2010-10-07 13:49  桃子在路上  阅读(112)  评论(0)    收藏  举报

10. “牛顿楼梯问题”: 有个楼梯共N级,上楼时每步可以跨1级、2级或者3级。问:共有多少种上楼梯的方法?

//“牛顿楼梯问题”: 有个楼梯共N级,上楼时每步可以跨1级、2级或者3级。问:共有多少种上楼梯的方法?
//
//楼梯只有一级的走法:
//如果只有一级楼梯,那就只有1种走法。而且是一步一级。即:1 = 1
//
//楼梯只有两级的走法:
//如果楼梯只有两级,就有两种走法,一步一级或者一步二级。即: 1 + 1 = 2
//
//楼梯有三级的走法:
//如果楼梯有三级,就有一步一级、一步一级和一步二级、一步二级和一步一级、一步三级共4种走法。即:1 + 2 + 1 =4
//
//楼梯有四级的走法:
//四级时,一步一级、一步二级、一步一级和一步三级、一步三级和一步一级、一步一级和一步二级和一步一级、一步二级和一步一级和一步一级、一步一级和一步一级和一步二级共7种走法。
//即:1 + 1 + 2 + 3 =7
//
//楼梯有五级时的走法:
// 1,1,1,1,1: 1种
//( 1,2,2 )、(2,2,1 )、(2,1,2):3种
//(3,2)、(2,3): 2种
//( 1,1,3)、(1,3,1)、(3,1,1):3种
//(1,1,1,2)、(1,1,2,1)(1,2,1,1)、
//(2,1,1,1) :4种
// 共13种走法。
//
//总结一下前五级的走法:
// 级数       一级       二级      三级      四级       五级
// 走法         1         2         4         7          13
//发现什么了?
//   好象从第四级开始,前面三个数的和等于后边的数啊。
//           1 + 2 + 4 = 7、2 + 4 + 7 = 13
//是不是有这个规律呢?
//
//那就再数一个六级吧。总比直接数12级好哇!
//1,1,1,1,1,1:1种
//2,2,2:1种
//3,3:1种
//(1,2,1,2)、(1,1,2,2)、(1,2,2,1)、(2,1,2,1)、(2,2,1,1)、(2,1,1,2):6种
//(1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)、(3,2,1):6种
//(1,1,1,3)、(1,1,3,1)、(1,3,1,1)、(3,1,1,1):4种
//(1,1,1,1,2)、(1,1,1,2,1)、(1,1,2,1,1)、(1,2,1,1,1)、(2,1,1,1,1):5种
//共 24种走法
//而:4 + 7 + 13 = 24
//正好验证了前面的结论,即:
//
//楼梯的走法,后边一个梯级是前三个梯级的和。
//即设梯级数为n ,第n级的走法为 F(n),因此有:
//F(n) =  F(n-1) + F(n-2)+ F(n-3)
//这样就有了如下的结果:
//     楼梯级数                        走法
//        一级                           1
//        二级                           2
//        三级                           4
//        四级                           7
//        五级                           13
//        六级                           24
//        七级                           44
//        八级                           81
//        九级                           149
//        十级                           274
//        十一级                         504
//        十二级                         927


program exRecurrence10_1;
var
     fn_1, fn_2, fn_3, fn, N, i : integer;
begin
     fn_3 := 1;
     fn_2 := 2;
     fn_1 := 4;
     write('How many floors there are? ');
     readln(N);
     writeln('1 floors: 1 methods.');
     writeln('2 floors: 2 methods.');
     writeln('3 floors: 4 methods.');
     for i := 4 to N do
     begin
          fn := fn_1+fn_2+fn_3;
          fn_3 := fn_2;
          fn_2 := fn_1;
          fn_1 := fn;
          writeln(i, ' floors: ', fn, ' methods.');
     end;
     readln;
end.