You are climbing a stair case. It takes n steps to reach to the top
Each time you can either climb 1 or 2 steps. In how many distingct ways can you climb to the tio?
分析
设f(n)
表示爬n
阶楼梯的不同方法数,为了爬到第n
阶楼梯,有两个选择:
- 从第
n-1
阶前进1步; - 从第
n-1
阶前进2步;
因此,有f(n)=f(n-1)+f(n-2)
。
这是一个斐波那契数列。
方法1,递归,太慢;方法2,迭代。
方法3,数学公式。斐波那契数列的通项公式为 a_n=\dfrac{1}{\sqrt{5}}\left[\left(\dfrac{1+\sqrt{5}}{2}\right)^n-\left(\dfrac{1-\sqrt{5}}{2}\right)^n\right]an=√5 __1___[(2___1+√5____)n−(2___1−√5____)n
]。
code example 1:
public static int climbStairs_1(int n)
{
int pre = 0;
int cur = 1;
for(int i = 1; i <= n; i++)
{
int tmp = cur;
cur += pre;
pre = tmp;
}
return cur;
}
code example 2:
public static int climbStairs_2(int n)
{
double s = Math.Sqrt(5);
//return (int)Math.Floor((Math.Pow((1+s)/2,n+1)+Math.Pow((1-s)/2,n+1))/s+0.5);
return (int)((Math.Pow((1 + s) / 2, n+1) - Math.Pow((1 - s) / 2, n+1)) / s);
}
code