一、 题目
爬楼梯,一共有n阶,每次可以跨1阶或2阶,则爬到顶部一共有多少种爬法?
二、 分析
设f(n)表示爬n阶楼梯的不同种方法数,为了爬到第n阶处,有两种选择:
1. 从n-1阶前进一步
2. 从n-2阶前进两步
因此有,f(n)=f(n-1)+f(n-2) 这不就是斐波那契数列吗?
故有,
方法1:迭代
方法2:递归
方法3:公式法 F(n)=(1/√5)*{[(1+√5)/2]^n -[(1-√5)/2]^n}
class Solution { public: int climbStairs(int n) { int flag; int stair0=1; int stair1=1; if(n<=0) return 0; if(n==1) return 1; for(int i=2;i<=n;i++) { flag=stair1; stair1=stair0+stair1; stair0=flag; } return stair1; } }; 公式法: class Solution { public: int climbStairs(int n) { double flag=sqrt(5); return floor((pow((1+flag)/2,n+1)+pow((1-flag)/2,n+1))/flag+0.5); } };
原文地址:http://blog.csdn.net/zzucsliang/article/details/39831321