一道经典的关于Fibonacci数列的面试题(问题)的新想法 -> N阶楼梯问题
在网上有很多关于Fibonacci数列的介绍,但有相当一部分介绍存在定义上的错误。
Fibonaaci数列的经典定义是F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2) (n>1),例如,第1到5项(不包括第0项)应该是1,1,2,3,5
还存在一种定义是F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2) (n>2),这种定义没有定义F(0)的值,但实际上是符合经典定义的。
但是网上存在很多错误定义:F(0)=1, F(1)=1, F(n)=F(n-1)+F(n-2) (n>1) ,这样第1到5项(不包括第0项)变成了1,2,3,5,8,基于这种定义,F(2)=2,明显是错误的。
关键错误在于错误定义了前2项的值。而这样的错误定义是不能完足Fibonacci数列的通项公式的:
基于这种错误定义,可以发现对于一道经典的Fibonacci数列问题(N阶楼梯问题)的普遍解法和答案是错误的。请参考http://zhidao.baidu.com/question/89441707.html
问题是:
有N阶楼梯,上楼梯的人可以一次上一阶,也可以一次上两阶,那有多少种方案可以走完这N阶楼梯。
普遍解法是将这个问题建模为Fibonacci通项公式问题,普遍答案是F(n)。
思路是通过Fibonacci数列进行数学建模。将走完N阶楼梯的所有方案进行等阶类划分得到两类方案:
1. 最后一步上一阶的方案
2. 最后一步上两阶的方案
这样可以得出F(1)=1, F(2)=2, F(n)=F(n-1)+F(n-2) (n>2)。到目前为止,这种建模方法还是正确的。
不要一看到F(n)=F(n-1)+F(n-2)就情不自禁的去套用Fibonacci通项公式,因为基于这种建模方法得出的数列递归定义中的前两项并不满足Fibonacci经典定义。
所以,N阶楼梯问题的答案不是F(n)。
实际上, 虽然这种建模方式不满足Fibonacci定义,但还好它的递归定义的形式和Fibonacci数列相同。那我们可以对它进行一些变换,从而将其构造成Fibonacci数列:
设S(x)为走完n阶楼梯的所有方案数量,x=n+1。则S(x)=0 (x=0), S(x)=1 (x=1), S(x)=1 (x=2), S(x)=S(x-1)+S(x-2) (n>2)。
在这种情况下S(x)=F(n+1), 而S(x)可以套用Fibonacci通项公式。
所以走完n阶楼梯的所有方案数量应该为F(n+1)