题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法.
青蛙每一次跳跃只有两种选择:一是再跳1级阶梯到达第n级阶梯,此时小青蛙处于第n-1级阶梯;或者再跳2级阶梯到达第n级阶梯,此时小青蛙处于n-2级阶梯
于是,n级阶梯的跳法总是依赖于前n-1级阶梯的跳法总数f(n-1)和前n-2级阶梯的跳法总数f(n-2).因为只有两种可能性,所以,f(n)=f(n-1)+f(n-2);
递推公式f(n)=f(n-1)+f(n-2):很熟悉,就是斐波那契数列求和
验证一下,青蛙1级有1种跳法,2级有2种跳法,3级有3种跳法,4级有5种跳法....
使用两种方式来求,递归算法和非递归算法
代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Jump
{
class Program
{
static void Main(string[] args)
{
for (int n = 0; n < 20; n++)
{
int result1 = JumpFloor1(n);
int result2 = JumpFloor2(n);
Console.WriteLine(result1 + "********" + result2);
}
Console.ReadKey();
}
/// <summary>
/// 递归算法
/// 缺点:太占空间,效率低下,计算到n时,总要依赖前一个n-1再算一遍
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
static int JumpFloor1(int n)
{
if (n < 0)
{
return 0;
}
else if (n == 0 || n == 1 || n == 2)
{
return n;
}
return JumpFloor1(n - 1) + JumpFloor1(n - 2);
}
/// <summary>
/// 非递归算法
/// 时间复杂度O(n)
/// 空间复杂度O(1)
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
static int JumpFloor2(int n)
{
if (n < 0)
{
return 0;
}
if (n == 0 || n == 1 || n == 2)
{
return n;
}
int f1 = 1;
int f2 = 2;
int result = 0;
for (int i = 3; i <= n; i++)
{
result = f1 + f2;
f1 = f2;
f2 = result;
}
return result;
}
}
}