递归算法深入浅出三:递归求Fibonacci斐波那契数列

2023-11-17


递归算法概述及常见算法列表,传送门:
http://blog.csdn.net/nthack5730/article/details/65537530


斐波那契数列

  斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
  这个数列从第三项开始,每一项都等于前两项之和。


递归求斐波那契(Fibonacci)数列

在这里我将根据递归两大特点(法则)和斐波那契数列的逻辑来设计对应的递归程序

1.递归程序的定义

  首先,设计一个fibo(int n)方法,返回值为:数列中第n个数的值

【注:斐波那契数第一个数值为1,第二个数值也是1,从第三个开始,每个数值为前两个数的和】

  当求【n=5】时,实际上是求当【n=3】和【n=4】时的和;
  那么求【n=3】就是求【n=1】和【n=2】时的和…..
  以此类推….
  当【n=1】或【n=2】时,程序直接返回1。

可得出公式:

f(n) = f(n-1) + f(n-2)

不难得出基本的递归调用代码:

public static int fibo(int n) {
    return fibo(n - 1) + fibo(n - 2);
}

  细心的人会发现这段代码是会得到递归死循环的,因为缺少了递归终止条件(跳出条件)
  


此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/66796854
更多有关老猫的文章:http://blog.csdn.net/nthack5730


2.递归程序的终止条件

1. 当【n=1】或【n=2】时,程序直接返回1。

if( n== 1 || n ==2){
    return 1;
}

2. 当然,也可以设计程序当【n=0】时返回0以及【n=1】时返回1;

if (n == 0) {
    return 0;
} else if (n == 1) {
    return 1;
}

  因为【n=2】是由【n=1】和【n=0】的和得到,也是1。

可以得出最终的代码:

public static int fibo(int n) {
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else{
        return fibo(n - 1) + fibo(n - 2);
    }
}

#


此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/66796854
更多有关老猫的文章:http://blog.csdn.net/nthack5730


3. 注意跳出的边界所在

  上面代码片中,第一个代码片就限制了n必须大于0,也就是n不能等于0,否则会出现“递归死循环”引发“StackOverflow”异常。

  在这里就可以引出“跳出递归调用边界”这种说法,也就是终止递归调用条件的值的设定!这个值的设定是需要根据现实计算情况和要求的计算逻辑实现的。
   
例如:
在斐波那契数列中,设计终止递归循环的边界是可以随意的,只要符合斐波那契数列的计算逻辑:
  1. 终止条件中的n的最小值要大于等于0,小于0没有任何意义,并且不符合斐波那契规则,造成不可估量错误。
  2. 要包含当n为基数以及偶数两种情况下n的返回值,主要是因为递归调用时有f(n-1)和f(n-2),那么就一定有奇偶数两种情况。

例子1:可以设计为在n=6时返回8,在n=7时返回13。

public static int fibo(int n) {
    if (n == 6) {
        return 8;
    } else if (n == 7) {
        return 13;
    } else{
        return fibo(n - 1) + fibo(n - 2);
    }
}

例子2:可以设计为在n=6时返回8,在n=5时返回5。

public static int fibo(int n) {
    if (n == 6) {
        return 8;
    } else if (n == 5) {
        return 5;
    } else{
        return fibo(n - 1) + fibo(n - 2);
    }
}

  两个例子基本相同,就是在调用的时候有不同:
调用时传入参数n的最小值不能小于终止判断条件的最小判断值:
  例子1.规定了n必须大于6
  例子2.规定了n必须大于5

  至于怎么选择,就在于使用者在实际中的需求来调整!


此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/66796854
更多有关老猫的文章:http://blog.csdn.net/nthack5730


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归算法深入浅出三:递归求Fibonacci斐波那契数列 的相关文章

随机推荐

  • c语言,通讯录

    目录 test c contact h contact c 我们先创建三个不同的文件 分别是主体函数test c 函数实现contact c 和头文件contact h test c 制作一个简单的目录即可 记得包含头文件 include
  • tensorflow人脸识别_「深度学习」用TensorFlow实现人脸识别(附源码,快速get技能)...

    本文将会带你使用python码一个卷积神经网络模型 实现人脸识别 操作难度比较低 动手跟着做吧 让你的电脑认出你那帅气的脸 由于代码篇幅较长 而且最重要的缩进都没了 建议直接打开源码或者点击分享 gt 复制链接 然后到浏览器里观看 执行顺序
  • qt之CheckBox选中与未选中的使用

    引言 给大家推荐一个超好用的软件 此软件也是优秀博主开发 主要是针对在我们开发过程中会不断的收集资料 而经过时间的洗礼 这些资料慢慢变得庞大起来 但是就出现了个问题 你2年前收集的资料 你在某天打开发现只有一个文件名 根本不知道具体里面干了
  • Ubuntu 16.04切换Intel集显为Nvidia独显教程

    在安装完Ubuntu后 会出现屏幕显示不正常 这时候可能是没有用到NVIDIA的独显 而是用的intel的集成显卡 一 检查 由于之前集成显卡的时候没有截图 大致下图上图形为llvmpipe LLVM 6 0 256 bits 的信息 没有
  • 17个面向Web 开发人员的杀手级网站,值得你收藏

    保持网站方便可能是最终的生产力技巧 以下是我用来让我的生活更轻松的一些最好的网站 让我们一起来看看它们 1 图片API 地址 https source unsplash com 世界上最强大的照片引擎 Unsplash API 是一种现代
  • 解题思路-LeetCode第55题:跳跃游戏

    解题思路 LeetCode第55题 跳跃游戏 题目描述 给定一个非负整数数组 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个位置 示例 1 输入 2 3 1 1 4 输出 true
  • 数值类型转换Number()、parseInt()、parseFloat()

    在开发中踩了一个坑 在进行两个字符串类型的值比较时 忘记转换成数值类型导致错误 所以借此正好整理下数值类型转换的几种方式的比较与区分 Number parseInt parseFloat 的比较区分 Number 1 如果传入的是数值类型
  • 毕业五年,从月薪3K到年薪50W+,需要掌握哪些核心技能?(c/c++研发岗)

    作为一个程序员 随着工作年限的不断增长 感觉自己的技术水平与自己的工作年限严重不符 想跳槽出去换个新环境吧 又感觉自己的能力达不到心仪公司的标准 即使投了简历也没人来通知自己面试 就这样在原来的公司一天天的混日子 时间久了 感觉自己废了 就
  • 微信小程序怎么改变默认的打开页面?

    刚开始接触微信小程序 本来想要打开一个新页面而不是用原来的 这个页面 每次编译之后怎么才能让默认打开的页面不是这个页面而是我指定的页面呢 就去找到app json 把想指定的页面放到第一个 那么默认打开的首页就是你指定的页面了 这是来源于官
  • 两行Python代码调整视频的亮度

    老猿Python博文目录 一 引言 最近看到好几篇类似 n行Python代码 的博文 看起来还挺不错 简洁 实用 传播了知识 带来了阅读量 撩动了老猿的心 决定跟风一把 推一个 n行Python代码系列 文章 对于视频中的画面 有时出于特定
  • 【VPR】 Command-line - vpr的命令行选项(一)

    目录 一 基本用法 二 命令行详解 2 1 阶段选项 Stage Options 2 2 图形选项 Graphics Options 2 3 常规选项 General Options 2 4 文件名选项 Filename Options 2
  • RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is F..

    今天在HPC上跑的方法疯狂报错 RuntimeError Attempting to deserialize object on a CUDA device but torch cuda is available is False If y
  • System.IO.IOException: Sharing violation on pat

    System IO IOException Sharing violation on path E wang downloadmanage Assets download IEM2 apk at System IO FileStream c
  • 浅谈机器学习-回归与分类的区别

    前言 机器学习的主要任务便是聚焦于两个问题 分类和回归 本文将浅谈下两者的区别 区别 回归会给出一个具体的结果 例如房价的数据 根据位置 周边 配套等等这些维度 给出一个房价的预测 分类相信大家都不会陌生 生活中会见到很多的应用 比如垃圾邮
  • Spring Boot 2 全局异常处理

    1 创建 MyRestControllerAdvice 类 并添加 RestControllerAdvice import com tm common dto Rjson import com tm common exception Bus
  • Landsat9卫星简介

    1 landsat 9 先来介绍下2021年9月27日发射的landsat 9 目前已经采集了第一批影像 10月31日 1 携带的传感器 二代陆地成像仪Operational Land Imager 2 OLI 2 二代热红外传感器 TIR
  • C++11中thread_local的使用

    C 11中的thread local是C 存储期的一种 属于线程存储期 存储期定义C 程序中变量 函数的范围 可见性 和生命周期 C 程序中可用的存储期包括auto register static extern mutable和thread
  • 区块链的跨链技术介绍完整版

    如果说共识机制是区块链的灵魂核心 那么对于区块链特别是联盟链及私链来看 跨链技术就是实现价值网络的关键 它是把联盟链从分散单独的孤岛中拯救出来的良药 是区块链向外拓展和连接的桥梁 自比特币七年前诞生以来 数以百计的竞争币被开发出来 有着各种
  • 深入了解Aviator表达式引擎:高性能的轻量级计算引擎

    在软件开发过程中 我们经常需要对数学和逻辑表达式进行求值和计算 传统的方式可能会导致性能瓶颈和复杂的代码逻辑 在这篇博客中 我们将介绍Aviator表达式引擎 一个轻量级且高性能的计算引擎 用于解析和执行数学和逻辑表达式 什么是Aviato
  • 递归算法深入浅出三:递归求Fibonacci斐波那契数列

    递归算法概述及常见算法列表 传送门 http blog csdn net nthack5730 article details 65537530 斐波那契数列 斐波纳契数列 又称黄金分割数列 指的是这样一个数列 1 1 2 3 5 8 13