IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【C语言】用递归和非递归,求第n个斐波那契数 -> 正文阅读

[数据结构与算法]【C语言】用递归和非递归,求第n个斐波那契数


问题引入 - 什么是斐波那契数列?

斐波那契数列中,第n项为n-1和n-2项之和

1,1,2,3,5,8,13,21,34,55……

这个数列非常经典,经常用于编程语言初学者的练习

接下来让我们用非递归和递归两种方式来实现这个数列

并了解两种方法的优缺点!


1.非递归方法(迭代)

什么是迭代?

迭代其实和循环的意义差不多(个人理解)

我们计算斐波那契数列的时候,需要从第一项和第二项1、1开始计算

没后一项数字都是前两项数字之和

这样我们就可以利用循环,从第一项开始不断相加,再使其中一个加数等于得到的

以此迭代,就能得到我们需要的第n个数字


代码实现

#include<stdio.h>
//非递归
int fo1(int a)
{
	int tmp = 0;
	int num1 = 1;
	int num2 =1;
	if (a < 3) //前两项都为1
	{
		return 1;
	}
	else//从第三项开始迭代
	{
		for (int i = 0; i <= a - 3; i++)
		{
			tmp = num1 + num2;
			num1 = num2;
			num2 = tmp;
		}
		return tmp;
	}
}

int main()
{
	int a,b = 0;
	scanf("%d", &a);
	b=fo1(a);
	printf("%d\n", b);
	return 0;
}

结果如图:

image-20211107224001697

迭代的缺点

这种方法有个缺点,即数字很大的时候,容易栈溢出

如果栈溢出没有影响,迭代的方法就非常适合

比如:

  • 题目规定了不考虑栈溢出

  • 题目设定了数字范围


2.递归

使用递归的基本方法,和迭代其实是一样的

最大的不同是:递归的核心是函数自己调用自己


代码实现

#include<stdio.h>
//递归
int fo2(int a)
{
	if ((a == 1) || (a == 2))
	{
		return 1;
	}
	else
	{
		return (fo2(a - 1) )+( fo2(a- 2));//n-1和n-2项
	}

}

int main()
{
	int a,b = 0;
	scanf("%d", &a);
	b=fo2(a);
	printf("%d\n", b);
	return 0;
}

最终执行的效果是一样的

递归的缺点

递归的实现方式是函数不停地自己调用自己
在这里插入图片描述

如图所示,当我们需要第50个斐波那契数列中的数时

函数需要从50开始,49、48,再48、47……

这么一直递归到第3个斐波那契列数,才能逐级返回每项的数字,得出最终答案

这就大大增加了程序运行的时间!

你可能会发现程序依旧很快运行完了,那是因为现在电脑cpu的运行速度已经非常快了

但在有运行时间要求的题目中,这样浪费时间是万万不可的


总结

递归和迭代两种方法各有优劣,我们需要在具体情境中选择是使用递归还是迭代

计算斐波那契数列只是这其中的一部分

如果这篇博客对你有帮助,那就点个赞再走吧!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:49:07  更:2021-11-09 19:50:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:46:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码