算法:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法.

题目描述:一只青蛙一次可以跳上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;
        }
    }
}

 

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值