C语言实现斐波那契数列的多种方法

news2024/11/22 17:17:17

        斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo  Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。对于解决此类问题方法有四,前两种对于初学者来说,应该可以思考研究明白,后两种就要求有一点点基础了,但是我相信,大家都可以学会的!!!

一、递归方法

完整代码展示如下:​

#include <stdio.h>

int fib(int n) 
{
    if (n <= 1) 
    {
        return n;
    } 
    else 
    {
        return fib(n - 1) + fib(n - 2);
    }
}

int main() 
{
    int n;
    printf("请输入一个整数: ");
    scanf("%d", &n);
    printf("斐波那契数列第%d项为: %d", n, fib(n));
    return 0;
}

递归方法实现原理如下:

       首先检查输入的n是否小于等于1。如果是,那么直接返回n,因为斐波那契数列的前两项就是0和1。

       如果n大于1,那么函数会递归地调用自身两次,分别传入n-1和n-2作为参数。这是因为斐波那契数列的定义是每一项都是前两项的和。

       最后,将这两个递归调用的结果相加,并返回结果。

结果展示:


二、迭代方法

​完整代码展示如下:​

#include <stdio.h>

int fib(int n) 
{
    if (n <= 1) 
    {
        return n;
    }
    int a = 0, b = 1, temp;
    for (int i = 2; i <= n; i++) 
    {
        temp = a + b;
        a = b;
        b = temp;
    }
    return b;
}

int main() 
{
    int n;
    printf("请输入一个整数: ");
    scanf("%d", &n);
    printf("斐波那契数列的第%d项为: %d", n, fib(n));
    return 0;
}

 迭代方法实现原理如下:

       函数首先检查n是否小于等于1,如果是,则直接返回n。这是因为斐波那契数列的前两项是0和1。

       如果n大于1,函数使用一个循环来计算斐波那契数列的第n项。在每次迭代中,它计算a和b的和,并将结果存储在临时变量temp中。然后,它将b的值赋给a,将temp的值赋给b。这样,a和b分别表示斐波那契数列的前两项和当前项。

       循环继续进行,直到i等于n。最后,函数返回b的值,即斐波那契数列的第n项。

结果展示:


三、数组方法

​​完整代码展示如下:​

#include <stdio.h>

void fib(int n) 
{
    int a[n];
    a[0] = 0;
    a[1] = 1;

    for (int i = 2; i < n; i++) 
    {
        a[i] = a[i - 1] + a[i - 2];
    }

    for (int i = 0; i < n; i++) 
    {
        printf("%d ", a[i]);
    }
}

int main() 
{
    int n;
    printf("请输入斐波那契数列的长度: ");
    scanf("%d", &n);
    fib(n);
    return 0;
}

 数组方法原理如下:

       首先,代码声明了一个长度为n的整型数组a。然后,通过将数组的第一个元素和第二个元素分别赋值为0和1,初始化了斐波那契数列的前两个元素。

       接着,使用一个for循环从索引2开始迭代到n-1。在每次迭代中,代码计算斐波那契数列的第i个元素,即前两个元素的和,并将其存储在数组a的相应位置。

       最后,使用另一个for循环遍历数组a,并使用printf函数打印出每个元素的值。这样,你就可以看到斐波那契数列的前n个元素被打印出来了。

结果展示:


 四、通项公式方法

要实现斐波那契数列通项公式方法,我们首先需要了解斐波那契数列的通项公式:

        F(n) = (φ^n - (-φ)^-n) / sqrt(5)

        其中,φ = (1 + sqrt(5)) / 2。

​​​完整代码展示如下:​

#include <stdio.h>
#include <math.h>

double fibonacci(int n) 
{
    double phi = (1 + sqrt(5)) / 2;
    return (pow(phi, n) - pow(-phi, -n)) / sqrt(5);
}

int main() 
{
    int n;
    printf("请输入要计算的斐波那契数列项数:");
    scanf("%d", &n);
    printf("第%d项斐波那契数列值为:%lf", n, fibonacci(n));
    return 0;
}

通项公式方法原理如下:

       函数内部首先定义了一个变量phi,它的值为(1 + sqrt(5)) / 2,这是斐波那契数列中相邻两项之比的近似值。

       接着,函数使用公式(pow(phi, n) - pow(-phi, -n)) / sqrt(5)来计算斐波那契数列的第n项。其中,pow(x, y)表示求xy次方,sqrt(x)表示求x的平方根。

       最后,函数返回计算得到的斐波那契数列第n项的值。

结果展示:


五、注意事项 

       第一种递归方法在计算较大的斐波那契数时可能会导致性能问题,因为它会重复计算许多相同的子问题。第三种方法使用了数组来存储已经计算过的斐波那契数列,可以提高效率。第四种方法使用了斐波那契数列的通项公式,可以直接计算出第n项的值,但是需要注意精度问题。


结语:以上就是相关斐波那契数列的解决方法了,希望对大家有所帮助。有什么问题欢迎大家留言~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1153292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第三十九天 | LeetCode 62. 不同路径、63. 不同路径 II

代码随想录算法训练营第三十九天 | LeetCode 62. 不同路径、63. 不同路径 II 文章链接&#xff1a;不同路径 不同路径II 视频链接&#xff1a;不同路径 不同路径II 1. LeetCode 62. 不同路径 1.1 思路 本题是个二维矩阵&#xff0c;因此 dp 数组也定义为二维的&…

select...for update 锁表了?

在MySQL中&#xff0c;事务A中使用select...for update where id1锁住了&#xff0c;某一条数据&#xff0c;事务还没提交&#xff0c;此时&#xff0c;事务B中去用select ... where id1查询那条数据&#xff0c;会阻塞等待吗&#xff1f; select...for update在MySQL中&#…

chatgpt 安卓版本提供google play商店版本太旧更新方法

多击play商店版本&#xff0c;开启开发者模式&#xff0c;再点击更新play商店。会自动下载最新版安装。记得开梯子。

太极培训机构展示服务预约小程序的作用如何

太极是适合男女老幼的&#xff0c;很多地方也有相关的学校或培训机构&#xff0c;由于受众广且不太受地域影响&#xff0c;因此对培训机构来说&#xff0c;除了线下经营外&#xff0c;线上宣传、学员获取和发展也不可少。 接下来让我们看下通过【雨科】平台制作太极教培服务预…

面试算法45:二叉树最低层最左边的值

题目 如何在一棵二叉树中找出它最低层最左边节点的值&#xff1f;假设二叉树中最少有一个节点。例如&#xff0c;在如图7.5所示的二叉树中最低层最左边一个节点的值是5。 分析 可以用一个变量bottomLeft来保存每一层最左边的节点的值。在遍历二叉树时&#xff0c;每当遇到新…

Apollo上车实践:打造安全、高效、舒适的出行体验

上车实践 概述自动驾驶车辆适配线控标准协议开环验证车辆 自动驾驶车辆集成了解传感器布置与连接了解车辆标定了解传感器标定循迹实践 自动驾驶测试与调车了解车辆安全操作流程了解实车控制调试了解实车定位调试 福利活动 主页传送门&#xff1a;&#x1f4c0; 传送 概述 通过…

C++设计模式_18_State 状态模式

State和Memento被归为“状态变化”模式。 文章目录 1. “状态变化”模式1.1 典型模式 2. 动机 (Motivation)3. 代码演示State 状态模式3.1 常规方式3.2 State 状态模式 4. 模式定义5. 结构( Structure )6. 要点总结7. 其他参考 1. “状态变化”模式 在组件构建过程中&#xf…

Apache ActiveMQ (版本 < 5.18.3) (CNVD-2023-69477)RCE修复方案/缓解方案

一、漏洞描述 Apache ActiveMQ 是美国阿帕奇&#xff08;Apache&#xff09;基金会的一套开源的消息中间件&#xff0c;它支持 Java 消息服务、集群、Spring Framework 等。 二、漏洞成因 ActiveMQ 默认开放了 61616 端口用于接收 OpenWire 协议消息&#xff0c;由于针对异常…

sqlite3 关系型数据库语言 SQL 语言

SQL(Structured Query Language)语言是一种结构化查询语言,是一个通用的,功能强大的关系型数据库操作语言. 包含 6 个部分: 1.数据查询语言(DQL:Data Query Language) 从数据库的二维表格中查询数据,保留字 SELECT 是 DQL 中用的最多的语句 2.数据操作语言(DML) 最主要的关…

视频下载工具Downie4 mac中文支持格式

Downie4 mac是一款视频下载工具。它支持下载各种视频网站上的视频&#xff0c;并且具有快速、稳定、易于使用的特点。 Downie支持下载各种视频网站上的视频&#xff0c;包括YouTube、Vimeo、Netflix、Hulu、Amazon等等。它具有快速、稳定的下载速度&#xff0c;可以帮助用户轻松…

HDFS架构介绍

数新网络_让每个人享受数据的价值浙江数新网络有限公司是一家开源开放、专注于云数据智能操作系统和数据价值流通的服务商。公司自主研发的DataCyber云数据智能操作系统&#xff0c;主要包括数据平台CyberData、人工智能平台CyberAI、数据智能引擎CyberEngine、数据安全平台Cyb…

手机app爬虫配置 (苹果手机)

近期在做某个项目,涉及到需要对手机app的进行数据爬取。在上一篇博文中,讲述了以模拟机为例的配置操作流程,这里将以苹果手机为例进行描述。 下面将讲述具体配置步骤 1、安装 抓包软件 fiddler (Fiddler | Web Debugging Proxy and Troubleshooting Solutions) ​ 下载后…

navicat15 恢复试用方法

1.运行&#xff0c;输入regedit&#xff0c;打开注册表 2.注册表中搜索 HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium&#xff0c;删除下面的Registration15XCS文件夹 3.注册表中再搜索 HKEY_CURRENT_USER\Software\Classes\CLSID 然后拉到文件夹目录的最后&#x…

实时视频混合和映射:Resolume Arena 6(专业的VJ)中文

Resolume Arena 6是一款专业的实时视频混合和映射软件&#xff0c;广泛应用于音乐表演、舞台演出、俱乐部活动等场合&#xff0c;打造令人惊叹的视觉效果和图像投影。它支持实时混合多个视频源&#xff0c;拥有视频映射功能以及提供多样实时效果和过渡效果&#xff0c;让用户能…

MySQL的MSI安装

MySQL的MSI安装 文章目录&#xff1a; MySQL的MSI安装材料准备&#xff1a;一、MySQL安装的准备工作二、MySQL的配置三、MySQL安装验证1、CMD命名验证2、MySQL 8.0 Command Line Client验证 材料准备&#xff1a; 1、x64或x86电脑 2、MySQL安装包 一、MySQL安装的准备工作 M…

Unity 粒子特效-第一集-五角星发射特效

一、基础理解 1.粒子特效的意思是&#xff0c;发射很多小的东西&#xff0c;组成一个效果 2.主要可以分成两种 a.一直循环&#xff08;如上图&#xff09; b.发射状 二、案例视频 今天我们做一个发射的五角星 三、案例分析 我们仔细来分析一下这个五角星的功能 1.每次显示1秒…

Android体育场馆预约系统+全套手把手视频教程

【项目功能介绍】 功能列表: 本系统包含后台管理和前端app双端系统, 本系统包含三个角色: 管理员,员工,app用户。 后台管理员的功能包含: 登录, 退出, 场馆管理,添加场馆,修改场馆,禁用启用场馆; 场馆场地管理,添加场馆场地,修改场馆场地,启用禁用场馆场地; 订单管理,确定订单…

Python自动化运维监控——批量监听页面发邮件(自由配置ini文件+smtplib)

一、程序样式 1.listen.ini配置文件 2.监控页面 3.日志 二、核心点 smtplib库&#xff1a;这里使用了smtp.qq.com与smtp.163.com两个发送邮件的地址&#xff0c;使用邮箱用户名与授权码来实现登录&#xff0c;端口都使用465&#xff0c;最后抛出异常&#xff0c;finally里…

分享一下微信小程序抽奖链接怎么做

标题&#xff1a;微信小程序抽奖链接制作全攻略&#xff0c;轻松玩转营销抽奖活动 一、引言 在当今的数字化时代&#xff0c;抽奖活动已经成为一种高效的市场营销策略&#xff0c;而微信小程序作为一个功能强大的移动端平台&#xff0c;为企业和个人提供了制作抽奖链接的便捷…

如何能够根据现有业务,结合代码清晰的知道技术实现是如何去实现的,方法论和切入点是什么?

要深入了解现有业务系统的技术实现&#xff0c;特别是当你想要准确理解某个具体功能或组件是如何实现的时候&#xff0c;你可以采取以下的方法论和切入点&#xff1a; 1. 文档和设计说明 首先查阅相关的技术文档和设计说明&#xff0c;这些文档通常会详细描述系统的架构、各个…