斐波那契数列(C/C++)

article/2025/10/12 15:45:03

目录

背景介绍

解法1:非数组+非递归

解法2:数组+非递归

解法3:非数组+递归

解法4:数组+递归


背景介绍

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

斐波那契数列(Fibonacci Sequence)又称黄金分割数列。

  该数列指的是这样的一列数字:0、1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6765、10946、17711、28657、46368…

  特别指出:第0项是0,第1项是第一个1。此数列从第2项开始,每一项都等于前两项之和。

  在数学上,斐波纳契数列被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)。

  在现代物理、准晶体结构、化学等领域,斐波纳契数列都有着直接的应用。美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载斐波那契数列此方面的研究成果。

斐波那契数列

  •   斐波那契数列的发明者,意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨。他被人称作“比萨的列昂纳多”。

      列昂那多·斐波那契于1202年研究兔子产崽问题时发现了此数列。设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不死亡。问:一对兔子一年能繁殖成多少对兔子?

      题中本质上有两类兔子:一类是能生殖的兔子,为大兔子;新生的兔子不能生殖,为小兔子;小兔子一个月就长成大兔子,求的是大兔子与小兔子的总和?

  •   十二月时有大兔子144对,小兔子89对,共有兔子144+89=233对

    从上表看出:

      ①每月小兔对数=上月大兔对数

      ②每月大兔对数等于上个月大兔对数与小兔对数之

    综合①②两点可得:每月大兔对数等于前两个月大兔对数之和  如果用un表示第n月的大兔对数,则有un=un-1+un-2(n > 2)

      每月大兔对数un排成数列为:1、1、2、3、5、8、13、21、34、55、89、144…

      那么此组数列就称为斐波那契数列

    END

斐波那契数列通项公式

  • 递推公式:

      斐波那契数列:0、1、1、2、3、5、8、13、21、34、55、89、144…

    如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式:显然这是一个线性递推数列。

    通项公式:

  • 此公式又称为“比内公式”,是用无理数表示有理数的一个范例。

解法1:非数组+非递归

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c;int main()
{a=1;b=1;for(int i=1;i<=38;i++)//38的原因是已知两个数的值 {c=a+b;//前一个值+前两个值a=b;//值位置的变换 b=c;}printf("%lld",c);return 0; 
}

解法2:数组+非递归

时间复杂度约为O(n)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=41;
ll num[maxn];int main()
{num[1]=1;num[2]=1;for(int i=3;i<=40;i++){num[i]=num[i-1]+num[i-2];}printf("%d",num[40]);return 0;
}

解法3:非数组+递归

时间复杂度约为(2^n)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll step=0,cnt=0;int Digui(ll step)
{cnt++;if(step==1||step==2){return 1;}return Digui(step-1)+Digui(step-2);
}int main()
{Digui(40);printf("%lld\n%lld",Digui(40),cnt);//答案 递归次数 return 0;
}

通过cnt计算发现,进行了非常多次数的递归,原因是我们进行了重复计算

 这样二叉树的结构导致进行了大量重复计算,这是我们特别不希望看到的,所以要进行记忆化

解法4:数组+递归

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=41;
ll num[maxn];
ll step=0,cnt=0;
bool vis[maxn];
int Digui(ll step)
{cnt++;if(step==1||step==2){return 1;}if(!vis[step]){vis[step]=true;num[step]=Digui(step-1)+Digui(step-2);return num[step];}else{return num[step];}
}
int main()
{vis[1]=true;vis[2]=true;num[1]=1;num[2]=1;Digui(40);printf("%lld\n%lld",Digui(40),cnt); return 0;
}

这样计算次数会大大降低


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

相关文章

关于斐波那契数列通项公式证明以及推广

在我们中学的时候老师都会举一个著名的兔子繁殖的例子&#xff1a;一般而言&#xff0c;兔子在出生两个月后&#xff0c;就有繁殖能力&#xff0c;一对兔子每个月能生出一对小兔子来。如果所有兔子都不死&#xff0c;那么一年以后可以繁殖多少对兔子&#xff1f;而这个问题就是…

斐波那契数列的四种解法

题目描述 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样一个数列&a…

斐波那契数列通项公式的求法

以下两种方法其实是一样的 1、方法一 其实所有人都知道T(n) T(n-1) T(n-2), T(1) T(2)1,T(n)也是一个斐波那契数列&#xff0c;求解时间复杂度的本质也就是求数列通项&#xff0c;结果MB的一个通项就把我难住了&#xff0c;只好回来google一下&#xff0c;把高中数学用的求…

【算法】斐波那契数列通项公式

特征方程和通项公式 如果数列 a n a_n an​的递推公式&#xff1a; a n c 1 a n − 1 c 2 a n − 2 a_nc_1a_{n-1}c_2a_{n-2} an​c1​an−1​c2​an−2​------(1) 根据待定系数法&#xff0c;假设 a n − x a n − 1 y ( a n − 1 − x a n − 2 ) a_n-xa_{n-1}y(a_{n-1…

斐波那契数列通项公式的推导证明----举一反三

斐波那契数列通项公式的推导证明----举一反三 1-前言2-斐波那契2-1-什么是斐波那契2-2-通项公式的证明2-3-举一反三 1-前言 2021年5月20号的那天&#xff0c;有对象的都忙着约会秀恩爱&#xff0c;而我这样的单身狗&#xff0c;只能自己学习沉淀自己&#xff0c;为梦想而奔波&a…

七种方式求斐波那契(Fibonacci)数列通项

一&#xff1a;递归实现   使用公式f[n]f[n-1]f[n-2]&#xff0c;依次递归计算&#xff0c;递归结束条件是f[1]1&#xff0c;f[2]1。 二&#xff1a;数组实现   空间复杂度和时间复杂度都是0(n)&#xff0c;效率一般&#xff0c;比递归来得快。 三&#xff1a;vector<in…

响应式 - 基于尺寸的响应式内边距

前言 为了衬托一个响应式宽度的图像元素&#xff0c;需要添加相对的内边距。如果使用静态的宽度内边距&#xff0c;图像内边距在较小的浏览器窗口中可能会显得过大&#xff0c;从而与其他附近元素相互挤压&#xff0c;甚至可能将图像挤出屏幕。 准备工作 理解盒模型属性的计算…

响应式 - 基于min-width和max-width属性的响应式布局

前言 响应式布局的很多解决方案都相当复杂&#xff0c;但是本节中的方法却非常简单。该方法通过在3个浮动元素上设置min-width和max-width属性来实现响应式布局。只要采用CSS中这个非常简单的响应式布局特性&#xff0c;就能够适应移动设备和不同尺寸的计算机屏幕。 准备工作 …

【愚公系列】2023年07月 WPF+上位机+工业互联 002-WPF布局控件

文章目录 前言一、WPF布局控件1.无边框设计2.理解布局2.1 WPF的布局处理2.1 布局原则2.3 布局过程 3.布局控件3.1 Grid控件3.1.1 属性3.1.2 案例 3.2 StackPanel控件3.2.1 属性3.2.2 案例 3.3 DockPanel3.3.1 属性3.3.2 案例 3.4 WrapPanel3.4.1 属性3.4.2 案例 3.5 UniformGri…

WordPress响应式主题:Three/博客/CMS/博客导航三合一主题

效果演示:http://cxyo.vip/ 下载地址在最后面 主题使用说明 1、首页设置 ①选择首页布局&#xff1a;博客布局或杂志布局或博客导航&#xff0c;默认博客布局&#xff0c;若选择杂志布局或博客导航后&#xff0c;必须设置CMS/导航布局后才能正常显示&#xff0c;否则会错位。…

使用dedecms构建响应式站点(二)——系统设置

在上一篇文章中&#xff0c;我们介绍了使用dedecms构建响应式站点的安装部分&#xff0c;这一次&#xff0c;我们来讲讲dedecms系统安装后的初始状态下如何进行各项系统设置。 进入管理后台后&#xff0c;我们会看到系统的管理菜单&#xff0c;如下图所示&#xff1a; 通过菜单…

浏览器请求与响应全过程详解

3. 浏览器请求与响应全过程详解 前言 当在浏览器上输入一个网站链接时&#xff0c;它是如何运行将网页内容呈现在我们的浏览器上的呢&#xff1f; 本文旨在对www.yangoogle.com网页进行详细分析&#xff0c;了解浏览器展示内容的整个流程。下图是在网上检索到一个较清晰的流程…

android创建布局文件,android学习——Android Studio下创建menu布局文件

一、问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下图: 但是会发现新建的布局文件好像很奇怪,不能添加menu以及item,如下图: 二、解决办法: 经过百度才知道…

当前比较流行的页面布局方式

1.固定宽度布局&#xff1a;当前各大网站的页面都是固定宽度布局。 优点&#xff1a;更好的适应当前市场上所有的设备&#xff1a;我们知道当前市面上主流的集中分辨率为以下几种 800*600 1024*768 1280*1024等属于普通显示器所支持的分辨率 1280*800 一般是14宽屏笔记本的最…

响应式 概念

&#xfeff;&#xfeff; 原文地址&#xff1a;http://isux.tencent.com/responsive-web-design.html 概念 响应式网页设计最初是由 Ethan Marcotte 提出的一个概念&#xff1a;为什么一定要为每个用户群各自打造一套设计和开发方案&#xff1f;Web设计应该做到根据不同设备环…

【iOS架构】iOS ReactiveCocoa函数响应式编程

声明式编程 声明式编程&#xff08;declarative programming&#xff09;是一种编程范型&#xff0c;与命令式编程相对立。它描述目标的性质&#xff0c;让电脑明白目标&#xff0c;而非流程。声明式编程不用告诉电脑问题领域&#xff0c;从而避免随之而来的副作用&#xff0c;…

基于AntDesign Vue的响应式登录页面

为了做一个自己的前后端分离的后台管理系统&#xff0c;特地做了一下登录页面。大概的架子如下&#xff0c;后面需要替换一下顶部导航的信息。先大概贴一下代码&#xff0c;以后直接复制使用。整体的布局是自己写的样式&#xff0c;如果后面要替换为其他的UI框架&#xff0c;比…

Angular最新教程-第六节编写响应式导航栏

这节课我们讲解如何使用bootstrap 4 编写响应式布局。 参考图我们还是参照Angular中文社区http://www.angularjs.cn/ 图中标注红色的部分,我自己不是很喜欢,所以做了一点小改动。 他这里也没有做响应式布局,所以样式就不抄他的,我们自己重写。 首先我们先简要的分析一…

什么是响应式网页设计?响应式布局的实现原理

2019独角兽企业重金招聘Python工程师标准>>> 概念 响应式网页设计最初是由 Ethan Marcotte 提出的一个概念&#xff1a;为什么一定要为每个用户群各自打造一套设计和开发方案&#xff1f;Web设计应该做到根据不同设备环境自动响应及调整。当然响应式Web设计不仅仅是…