有一段楼梯有10级台阶,规定每一步只能跨一级或两级或三级,要登上第10级台阶有几种不同的走法?
思路:
0节楼梯: 1 (0)
1节楼梯: 1 (1)
2节楼梯: 2 (11、 2)
3节楼梯: 4 (111、 12、 21、 3)
4节楼梯: 7 (1111、 121、 211、 31、
13、
112、 22 )
7=4+2+1
4=2+1+1
2=1+1+0
1=1+0+0
抽象f(n)=f(n-3)+f(n-2)+f(n-1)
/// <summary>
/// n为阶梯数
/// </summary>
/// <param name="n"></param>
/// <returns>z 为走法数</returns>
static long fib3(int n)
{
long x = 0, y = 0,z=1;
long w, k;
for (int j = 0; j < n; j++)
{
w = z;
k = y;
z = x + y + z;
y = w;
x = k;
}
return z;
}
static void Main(string[] args)
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(fib3(i));
}
Console.Read();
}
}
迭代法性能
递归法性能
/// <summary>
/// 递归算法
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
static long dfib1(int n)
{
if (n < 1)
{ return 0; }
if (n == 1)
return 1;
if (n == 2)
return 2;
if (n == 3)
return 4;
return dfib1(n - 1) + dfib1(n - 2) + dfib1(n-3);
}