C语言----斐波那契数列(附源代码)

news2024/12/23 11:32:21

      各位看官们好,当我写了上一篇博客杨辉三角后,有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)=f(n-2)+f(n-1)。就是当前是前两项之和,然后下标1和0都是1.从第三项开始计算的。那么我们知道规律,那么我们就直接来讲讲如何实现和实现方法有哪些吧。

递归

        我想大家学习C语言到现在应该看到斐波那契数列应该想到的是递归吧。我想递归大家应该还知道它的核心思想吧,就是每递归一次,那么这个问题就要越靠近我们想要的答案一次,一直递归到想要答案就返回。好,那么我们现在想一想怎么搞。那么我们知道我们有特殊情况就是,如果我输入1和2的话,那么我们得到的值是1.那么我们这个就可以直接写出来哇。好当我们写出了特殊情况后,我们来思考正常情况。那么我们也知道我们规律就是前两项之和。那么我们就直接写啊,是不是。大家思考一下:


int xixi(int a)
{
	if (a == 1 || a == 2)
	{
		return 1;
	}
	else
	{
		 return xixi(a - 1) + xixi(a - 2);
	}
}
int main()
{
	int a = 0;
	printf("请输入要多少位的斐波那契数\n");
	scanf("%d", &a);
	printf("%d ", xixi(a));
	return 0;
}

        我们只要不是特殊情况的话,我们只需要在递归的时候将前两项传来,直到设定的值,那么我们就可以得到结果了。大家思考一次,是吧。代码很简单,但是有一个问题就是。递归的内存占用太多了。很有可能造成栈溢出。也许大家输入前面的数字编译器还是很快的输出的。但是当我们输入较大值如100这类的我们就可以明显的感觉速度很慢了。所以递归大家可以知道这个方法但是使用起来限制还是很大了。大家知道有这个办法就可以了。

for循环

      okok,当我们写了递归后,我们递归其实还是有点难度的,毕竟我们还是需要思考一下,怎么实现的吧。但是我们要是用for循环的,我们从最开始学习C语言的时候我们就知道有个for循环。那么最基础的知识其实是很有作用的,那么我们来思考一下for循环如何来实现我们的斐波那契数吧。但其实for循环也是比较简单的,毕竟大家思考一下。我们最基本的规律就是前两项之和f3,那么我们就创建三个变量吧。一个作为最后的相加项我们最后返回的。然后另外两个就一个作为前一项f1一个作为前两项f2。那么这个如何交换值值嘞。首先我们就最开始的时候考虑特殊情况。1和2的时候那么我们就直接从2开始吧,如果我输入的值是1或者2的话,for本来就等于2了,不执行,然后直接返回f3。那么我们可以确定了f3的初始值为1吧。并且我们现在把特殊情况也处理了。那我们正常的话f3=f1+f2。然后f2=f3。这个是为什么嘞,因为我们大家算f3,是不是就是我们的前一个f3加一个f2但我不能直接写f3的前一项啊。所以f2就成为上一个f3吧。那f2成为上一个f3那。f1自然而然的变成了上一个的f2了吧。这样大家是不是就通透了呀。我们将f1,2,3全部设为1.然后for循环从2开始那么就排除了特殊情况。然后最开始就将f3更新,然后f2和f1相继跟新这样如果下次没有更新的话,我们就可以直接确定了返回值f3了。

int xixi(int a)
{
	int f3 = 1;
	int f2 = 1;
	int f1 = 1;
	for (int y = 2; y < a; y++)
	{
		f3 = f1 + f2;
		f1 = f2;
		f2 = f3;
	}
	return f3;
}
int main()
{
	int a = 0;
	printf("请输入要多少位的斐波那契数\n");
	scanf("%d", &a);
	printf("%d", xixi(a));
	return 0;
}

        大家需要注意一下啊。就是f1与f2更新的顺序不要乱哦。不然的话f1也变成上一个f3了。然后就太多的麻烦了。

数组

        OK呀,其实讲了上面的两个方法就差不多了的,但是我还想到了一个方法,就是我们使用数组来实现这个。那大家先想一想数组如何实现这个了。但其实啊。也很简单与我们的for循环是差不多的。我们上一个for循环是需要实时更新的,但我们数组其实就是很简单的。我们创建一个较大的数组。然后没循环一次,那么就往数组里写入新的值,然后循环到设定值结束,那么就返回这个数组下标的的元素就可以了。那么简单的思路那我们就直接开始搞吧。

int xixi(int a)
{
	int i = 0;
	int arr[100] = {0, 1,1};
	for (i = 2; i <= a; i++)//从第一项开始
	{
		arr[i] = arr[i - 1] + arr[i - 2];
	}
	return arr[a];

}
int main()
{
	int a = 0;
	printf("请输入要多少位的斐波那契数\n");
	scanf("%d", &a);
	printf("%d", xixi(a));
	return 0;
}

        大家看看上面咦。为什么我们创建数组的时候开始要给0,1,1的值啊。其实也很简单就是我们数组下标啊。我们原本计算的都是从1开始的,但是我们数组是下标如果不设置得话,那么下标0为1,设置的值就会大很多,当然是越向后值就比正确值大很多。大家可以下来尝试一下。

      好了,那么我们上面三种方法就差不多了,递归方法虽然有,但是可以处理小部分递归次数较小的,如果太大了。那么就是会很慢甚至报错。建议少用用for循环的方法也可以。好了。以上就是本篇博客的内容了。如果还有补充的话,希望大家可以评论区留言。

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

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

相关文章

旧衣服回收小程序:探索旧衣回收市场的创新发展

每年我国就有将近800万吨旧衣服&#xff0c;在生活水平的日益提高下&#xff0c;这个数字也在逐渐增加。目前&#xff0c;我国旧衣回收的产业链也在完善中&#xff0c;旧衣服出口贸易逐年增加&#xff0c;市场发展空间不断扩大。此外&#xff0c;旧衣回收市场投入低、风险小、利…

SystemC学习使用记录

一、概述 对于复杂的片上系统&#xff0c;在进行RTL编码前&#xff0c;需进行深入的系统级仿真&#xff0c;以确认设计的体系结构是否恰当、总线是否能满足吞吐量和实现性要求以及存储器是否浪费&#xff0c;所进行的这些仿真要求在芯片的仿真模型上运行大量的软件&#xff0c…

PLL-分频器

概念 分频器的性能一般用四个参数来规定:(1)分频比&#xff0c;(2)最大允许输入频率fmax&#xff0c;(3)功耗&#xff0c;(4)最小允许输入电压摆幅(也叫“灵敏度”)。虽然分频器的相位噪声也很重要&#xff0c;但在大多数情况下它可以忽略不计。 把一般分频器的输入灵敏度画成…

微信支付商户的“商家转账到零钱”产品快速开通指南

微信支付商户的“商家转账到零钱”功能为商家提供了便捷的转账途径&#xff0c;尤其适用于费用报销、员工福利发放、合作伙伴货款或分销返佣等多种场景。那么&#xff0c;如何快速开通这一功能呢&#xff0c;需要快速开通的商户可以联系小编。 首先&#xff0c;确保你的企业已经…

C++基础与深度解析 | 表达式 | 操作符

文章目录 一、表达式基础1.表达式的值类别2.表达式的类型转换 二、表达式详述1.算术操作符2.逻辑与关系操作符3.位操作符4.赋值操作符5.自增与自减运算符6.其他操作符三、C17对表达式的求值顺序的限定 一、表达式基础 表达式由一到多个操作数组成&#xff0c;可以求值并 ( 通常…

Node.js 学习笔记 express框架

express express 使用express下载express 初体验 express 路由什么是路由1路由的使用验证的方法 2获取请求报文参数3获取路由参数4响应设置响应报文 express 中间件5中间件全局中间件路由中间件 6静态资源中间件注意事项案例 7请求体数据8防盗链实现防盗链 9路由模块化router E…

Linux: Make工具以及Makefile文件

make工具 人们通常利用 make 工具来自动完成编译工作。这些工作包括&#xff1a;如果仅修改了某几个源文件&#xff0c;则只重新编译这几个源文件&#xff1b;如果某个头文件被修改了&#xff0c;则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作&…

TreeMap详解:Java 有序 Map 原理与实现

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

论文解读:Self-Prompt Mechanism for Few-Shot Image Recognition

文章汇总 存在的问题 由于提示文本和图像特征之间固有的模态差异&#xff0c;常规的提示方法的性能受到限制。 动机 让视觉信息自己给自己提示 解决办法 SPM涉及到图像编码器跨空间和通道维度产生的固有语义特征的系统选择&#xff0c;从而产生自提示信息。随后&#xff…

【yolov8分类任务-全流程】【公开数据白内障-101:101例白内障手术的视频数据集】

文章目录 1.公开数据集1.1.白内障-101&#xff1a;数据集文件结构1.1.1.视频文件1.1.2.注释文件(1)videos.csv(2) phases.csv(3)annotations.csv 1.2. 数据处理1.2.1.抽帧脚本全部代码&#xff08;每行都有注释&#xff09;1.2.2.分类任务划分数据集脚本 2.yolov8分类任务训练2…

【教程】Jetson安装PyQt5和CUDA版OpenCV

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 安装PyQt5 注意目前似乎只支持Python3.6&#xff01;&#xff01;&#xff01; sudo apt install pyqt5* -y sudo apt-get install python3-pyqt…

Java | Leetcode Java题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> grayCode(int n) {List<Integer> ret new ArrayList<Integer>();for (int i 0; i < 1 << n; i) {ret.add((i >> 1) ^ i);}return ret;} }

每日一题12:Pandas:数据重塑-融合

一、每日一题 解答&#xff1a; import pandas as pddef meltTable(report: pd.DataFrame) -> pd.DataFrame:reshaped_report report.melt(id_varsproduct, var_namequarter, value_namesales)return reshaped_report 题源&#xff1a;Leetcode 二、总结 melt()函数是Pa…

Python 机器学习 基础 之 监督学习 [线性模型] 算法 的简单说明

Python 机器学习 基础 之 监督学习 [线性模型] 算法 的简单说明 目录 Python 机器学习 基础 之 监督学习 [线性模型] 算法 的简单说明 一、简单介绍 二、监督学习 算法 说明前的 数据集 说明 三、监督学习 之 线性模型 算法 1、用于回归的线性模型 2、线性回归&#xff0…

SpringCloud------Feign,Geteway

Feign 所以我们使用一门新的技术&#xff1a;声明式的http客户端Feign 第一步&#xff1a;引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> …

Vue 封装axios

【一】准备工作 &#xff08;1&#xff09;安装必要插件 安装Axios&#xff0c;这是必要的。默认最新版 npm install axios -S 或 cnpm install axios -S安装elementui-plus&#xff0c;用于提示信息 npm install element-plus --save # 或 cnpm install element-plus --s…

Selenium自动操作鼠标的方法及示例(鼠标左右键单击、左键双击、拖动等)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

五分钟“手撕”时间复杂度与空间复杂度

目录 一、算法效率 什么是算法 如何衡量一个算法的好坏 算法效率 二、时间复杂度 时间复杂度的概念 大O的渐进表示法 推导大O阶方法 常见时间复杂度计算举例 三、空间复杂度 常见时间复杂度计算举例 一、算法效率 什么是算法 算法(Algorithm)&#xff1a;就是定…

BakedSDF: Meshing Neural SDFs for Real-Time View Synthesis 论文阅读

&#xff08;水一篇博客&#xff09; 项目主页 BakedSDF: Meshing Neural SDFs for Real-Time View Synthesis 作者介绍 是 Mildenhall 和 Barron 参与的工作&#xff08;都是谷歌的&#xff09;&#xff0c;同时一作是 Lipman 的学生&#xff0c;VolSDF 的一作。本文引用…

234.回文链表

给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;head …