【递归 动态规划 备忘录法】Fibonacci数列(斐波那契数列)(C++)

article/2025/7/28 3:44:30

一、什么是Fibonacci数列

  • 斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144…
  • 用文字来说,就是从第3项开始,每一项都等于前两项之和。
  • 至于包不包括0,一番查阅后没有得到证实… 不过重要的是“第3项开始,每一项都等于前两项之和”这个定义。

二、简单递归

1. 设计递归方程

  • 斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144…
  • 递归定义
    F ( n ) = { 1 n = 1 1 n = 2 F ( n − 1 ) + F ( n − 2 ) n > 2 F(n)=\begin{cases} 1 & n=1 \\ 1 & n=2 \\ F(n-1)+F(n-2) & n>2 \end{cases} F(n)=11F(n1)+F(n2)n=1n=2n>2
  • 当 n=1 || n=2 时,结束递归。

2. 编写程序代码

// 【递归】Fibonacci数列(斐波那契数列)
#include<iostream>
using namespace std;int fibonacci(int num);int main()
{int num = 0; // 项数cout << "Fibonacci数列,请输入项数(正整数):";cin >> num;cout << "此项为:" << fibonacci(num) << endl;	//输出结果return 0;
}int fibonacci(int num)
{if (num <= 2)return 1;		// F(1)=1,F(2)=1elsereturn fibonacci(num - 1) + fibonacci(num - 2);	// F(n)=F(n-1)+F(n-2)
}

3. 运行结果

运行截图

三、动态规划

1. 再次分析上述递归算法

  • 我们举例研究一下上面的递归算法:计算F(5)
    F(5) = F(4) + F(3);-> F(4) = F(3) + F(2);-> F(3) = F(2) + F(1);-> F(2) = 1;-> F(1) = 1;-> F(3) = F(2) + F(1); // 重复计算了 F(3)-> F(2) = 1;-> F(1) = 1;
  • 从F(5)的例子中可以明显看到在递归中F(3)被我们重复计算了;
    少次循环中这并不明显,但可以想象,当递归层数非常大时,我们将会进行非常大量的重复计算,浪费大量的时间和资源。
  • 我们很容易想到:既然重复计算了,那我们把计算过的值保存一下就好了嘛。

2. 动态规划

  • 动态规划的基本思想是:将原问题拆分为若干子问题,自底向上的求解。
  • 自底向上的求解,即是先计算子问题的解,再得出原问题的解。动态规划详情–>详情

3. 备忘录法

  • 备忘录法是自顶向下的算法,控制结构与直接递归相似,但其维护了一个记录子问题的表,以此避免了子问题的重复求解。

4. 程序实现

(1)动态规划 - 自底向上

// 【动态规划】Fibonacci数列(斐波那契数列)
#include<iostream>
using namespace std;int main()
{// 项数int n;cout << "Fibonacci数列,请输入项数:";cin >> n;// 保存计算过的值int* F = new int[n];F[1] = 1; // F(1)=1F[2] = 1; // F(2)=1// 自底向上计算for (int i = 3;i < n;i++)F[i] = F[i - 1] + F[i - 2];// 输出结果cout << F[n] << endl;delete[] F;return 0;
}

(2)备忘录法 - 自顶向下

// 【备忘录法】Fibonacci数列(斐波那契数列)
#include<iostream>
using namespace std;int F[256] = { 0 };	// 保存子问题解的表int fibonacci(int n);int main()
{// 项数int n;cout << "Fibonacci数列,请输入项数(正整数):";cin >> n;// 保存子问题解的表,前两个数为 1F[1] = 1;F[2] = 1;// 自顶向下计算,并保存子问题的解;输出结果cout << fibonacci(n) << endl;return 0;
}int fibonacci(int n)
{if (F[n] > 0)return F[n];elsereturn (F[n] = fibonacci(n - 1) + fibonacci(n - 2));
}
  • 运行结果都一样,如上图。

三、友情链接~

  • 其它一些常见算法请参阅此链接~

最后,非常欢迎大家来讨论指正哦!


http://chatgpt.dhexx.cn/article/MVmS6tFi.shtml

相关文章

算法-斐波那契数列Fibonacci

斐波那契数列 Fibonacci 斐波那契数列是这样的数列: 0、1、1、2、3、5, 8、13、21、34 …… 下一项是上两项的和。 2 是上两项的和(1+1) 3 是上两项的和(1+2)、 5 是(2+3)、 依此类推! 更多有意思的介绍可以见参考链接; 算法 1. 直接递归 初步想法就是采用递归的…

回顾斐波那契数列

一 概述 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列。该数列是指递归方法定义为&#xff1a; F(0) 0&#xff0c;F(0) 1&#xff0c;F(n) F(n-1) F(n-2) (n ≥ 2&#xff0c;n ∈ N*) 的数列。 具体表现形式为&#xff1a;0&am…

题:斐波那契数列(Fibonacci数列)——一个数最少几步变成斐波那契数列的数

题目描述&#xff1a; Fibonacci数列就形如&#xff1a;0, 1, 1, 2, 3, 5, 8, 13, ...&#xff0c;在Fibonacci数列中的数我们称为Fibonacci数。给你一 个N&#xff0c;你想让其变为一个Fibonacci数&#xff0c;每一步你可以把当前数字X变为X-1或者X1&#xff0c;现在给你一个…

Fibonacci数列前20项(斐波那契数列)

HZKs Blog 本文标题&#xff1a; Fibonacci数列前20项(斐波那契数列) 本文链接&#xff1a; https://blog.zekun.fun/2021/coding/cppfibonacci数列前20项斐波那契数列/ 题目描述 Fibonacci数列的特点&#xff1a;第1,2个数为1,1。从第3个数开始&#xff0c;概述是前面两个数之…

for_each函数用法

Introduction 學習過STL的container後&#xff0c;想要存取每一個iterator&#xff0c;你一定寫過以下的程式 #include < vector > #include < iostream > using namespace std; int main() { int ia[] {1, 2, 3}; vector<int> ivec(ia, ia size…

each函数用法

<?php/*each()只是一个函数&#xff0c;参数就是一个数组&#xff0c;返回的值也是一个数组1.返回的值也是一个数组&#xff0c;数组固定有4个元素&#xff0c;而且下标也是固定的1(值) value(值) 0(下标) key(下标)2.each()只是处理当前的元素将当前的元素(默认当前元素是…

$.each的用法

1、示例1&#xff1a; <script type"text/javascript">var arr["1","2","3"];<span style"white-space:pre"> </span>//定义arr数组$.each(arr, function() {alert(this);<span style"white-spac…

for_each用法示例

文章目录 前言示例demo 前言 由于偶然间发现for_each能使得避免使用for循环&#xff0c;大大简化了代码。这里简单记录下for_each的一个简单示例demo,方便温习。 示例demo #include <iostream> #include "vector" #include "algorithm"void myfun…

字长、字节、字、字位的区别

字长、字节、字、字位的区别&#xff1a; &#xff08;1&#xff09;概念不一样 同一时间处理二进制数位数叫字长&#xff0c;字长是直接用二进制代码指令表达的计算机语言。 字节&#xff08;Byte &#xff09;是计算机信息技术用于计量存储容量的一种计量单位&#xff0c;…

微型计算机一个汉字多少字节,一个汉字多少字节(Byte)?

2006-01-07 一个汉字有几个字节&#xff1f; 依据编码形式&#xff1a; GB&#xff0d;231280 编码为 2个字节(Byte) 包含了 20902 个汉字&#xff0c;其编码范围是 0x8140-0xfefe。 GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字&#xff0c;增加了藏、蒙等少数民族的…

计算机中1kb等于多少字节,在计算机中1kb等于多少字节

在计算机中1kb等于1024个字节。字节是计算机信息技术用于计量存储容量的一种计量单位&#xff0c;也表示一些计算机编程语言中的数据类型和语言字符。一个字节存储8位无符号数。 本文操作环境&#xff1a;windows10系统、thinkpad t480电脑。 (学习视频分享&#xff1a;编程视频…

使用Java8新特性对List进行排序

前言&#xff1a; 在项目开发中往往会遇到各种数据需要排序展示在页面上&#xff0c;常见的从数据库查使用数据库的排序&#xff0c;还有一种就是使用我们的开发语言进行排序&#xff0c;这里给大家演示使用java8的新特性进行排序&#xff0c;众所周知java8带来了函数式编程和…

java8特性之forEach篇

java8特性之forEach篇 forEach介绍使用条件迭代原理性能 forEach介绍 forEach是java8的特性之一&#xff0c;它可以大大简化代码的操作&#xff0c;比如有关HashMap的操作&#xff1a; HashMap<Integer, String> hashMap new HashMap<>(3); hashMap.put(1, &quo…

java8特性快速对list集合的筛选过滤和计算

java8特性快速对list集合的筛选过滤和计算 一、准备工作 1.创建一个Student对象 package com.shiro.test.java8特性;import java.io.Serializable;/*** 学生的实体类*/ public class Student implements Serializable {private String id;private String username;private In…

Java8特性大全(最新版)

一、序言 Java8 是一个里程碑式的版本&#xff0c;凭借如下新特性&#xff0c;让人对其赞不绝口。 Lambda 表达式给代码构建带来了全新的风格和能力&#xff1b;Steam API 丰富了集合操作&#xff0c;拓展了集合的能力&#xff1b;新日期时间 API 千呼万唤始出来&#xff1b;…

Java 8特性之Optional详解

一、Optional类 简介 Optional类是 Java 8 引入的一个很有趣的特性。它主要解决的问题是臭名昭著的空指针异常&#xff08;NullPointerException&#xff09; Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true&#xff0c;调用get()方法会返回…

Java基础之java8 新特性

Java基础之java8 新特性 一、Lambda 表达式二、Stream 初体验三、方法引用四、默认方法五、Optional 类六、Base 64七、字符串拼接八、 equals 与 instanceof九、final 一、Lambda 表达式 Lambda 表达式是在 Java8 中引入的&#xff0c;并号称是 Java8 的最大的特点。Lambda 表…

java8新特性Lambda和Stream以及函数式接口等新特性介绍

主要内容 1.Lambda 表达式 2.函数式接口 3.方法引用与构造器引用 4.Stream API 5.接口中的默认方法与静态方法 6.新时间日期API 7.其他新特性 Java 8新特性简介 速度更快速度更快代码更少&#xff08;增加了新的语法Lambda 表达式&#xff09;强大的Stream API便于并行最大化…

python 读取并显示图片的两种方法

转自&#xff1a;http://www.cnblogs.com/yinxiangnan-charles/p/5928689.html 在 python 中除了用 opencv&#xff0c;也可以用 matplotlib 和 PIL 这两个库操作图片。本人偏爱 matpoltlib&#xff0c;因为它的语法更像 matlab。 一、matplotlib 1. 显示图片 import matplotli…

Python同时显示多张图片在一个画面中(两种方法)

很多时候需要把很多图片同时显示到一个画面中&#xff0c;现在分享两个方法&#xff0c;这里我恰好拿之前写的爬取网上图片保存到本地的爬虫模型爬一些图片作为素材Python 爬虫批量爬取网页图片保存到本地。 得到素材如下所示&#xff1a; 现在让这些图片同时显示。 方法一 …