斐波那契数列

  斐波那契数列满足如下定义:

    当n=0时,f(0)=0;

    当n=1时,f(1)=1;

    当n>1时,f(n)=f(n-1)+f(n-2);

  可以很快写出类似如下的代码:

1 public static long f(int n){
2         if(n < 0) return -1;
3         if(n == 0) return 0;
4         if(n == 1) return 1;
5         return f(n - 1) + f(n - 2);
6     }

  但是如上递归解法有很严重的效率问题,例如计算f(10)的值,需要f(8)和f(9)的和,子递归一f(8)需要计算f(6)和f(7)的和,子递归二中计算f(9)的值需要f(8)和f(7)的和,此时f(8)又重复算了一次。此算法的时间复杂度是以n的指数的方式递增的。

  改进的方法可以考虑从f(0)逐步计算到f(n)(即先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)……),并用一个长度为2的整型数组存储每次需要迭代的值。很明显,此算法的时间复杂度值有O(n)。

 1 public static long f(int n){
 2         if(n < 0) return -1;
 3         long[] arr = {0, 1};
 4         if(n < 2) return arr[n];
 5         long pSum;
 6         for(int i = 2; i <= n; i++){
 7             pSum = arr[0] + arr[1];
 8             arr[0] = arr[1];
 9             arr[1] = pSum;
10         }
11         return arr[1];
12     }

  接下来来看一下斐波那契数列的应用

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

  先从最简单情况出发:

    如果有1级台阶,则只有一种跳法,即f(1)=1。

    如果有2级台阶,则可以有两种跳法(1级1级跳或2级跳),即f(2)=2。

    如果有3级台阶,考虑第一次跳的时候有两种选择:一种是一次跳1级,则此跳法数目等于剩下(3-1)级台阶的跳法,即等于f(3-1),另一种是一次跳2级,则此跳法数目等于剩下的(3-2)级台阶的跳法,即等于f(3-2),所以f(3)=f(3-1)+f(3-2)=3。

  再从一般情况出发:

   当n>2时,第一次跳有两种选择:一种是一次跳1级,则跳法数目等于后面剩下(n-1)级台阶的跳法,即f(n-1),一种是一次跳2级,则跳法数目等于后面剩下的(n-2)级台阶的跳法,即f(n-2),所以f(n)=f(n-1)+f(n-2)。

  不难看出这实际上就是斐波那契数列了。

 

 

转载于:https://www.cnblogs.com/honghuzidelaoren/p/3637911.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值