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.
浙公网安备 33010602011771号