浅入快出--递归之斐波那契数列(一)
发布日期:2021-07-17 15:49:23
浏览次数:4
分类:技术文章
本文共 1276 字,大约阅读时间需要 4 分钟。
引言
递归在计算机编程中,是指在函数的定义中使用函数自身的方法。能够适用于递归方法的问题,一般都具有以下两个特点:
- 该问题能够分解成规模较小但方法形式相同的子问题
- 该问题不会无限分解下去,必须具有一个终止条件
递归函数(输入){ if(终止条件) return 终止条件下的解 输入=子问题 return 递归函数(输入)}
斐波那契数列
斐波那契数列是使用递归的经典案例,以下数列就是斐波那契数列:
0,1,1,2,3,5,8,13,21......
那么对于以上数列的数学定义如下:
根据上述数学定义,我们可以轻而易举地写出斐波那契数列的递归函数:
long long fib(int n){ if (n == 0) return 0; else if (n == 1) return 1; // 前两个数为终止情况 else return fib(n-1) + fib(n-2); // 分解为子问题}int main(){ int n; while(1) { scanf("%d",&n); printf("The %dth number in the Fibonacci sequence is %lld.\n",n,fib(n)); } return 0;}
演示GIF:
当我们将输入的数字逐渐增大时,由10,20变化到50,我们发现结果的出现时间越来越慢,到50时结果干脆不出现了,难道是程序的问题吗?当然不是,原因其实是我们并没有正确地使用递归方法。
斐波那契数列高效递归方法
首先我们需要分析一下,为什么在上一节中所实现的递归方法效率如此低下。文字太累,直接上图。
你会发现fib(0)重复计算了2次,fib(1)重复计算了3次,fib(2)重复计算了2次,导致这样问题的出现是因为我们并没有高效地将原问题分解为规模较小的子问题。
我们原本是从后往前分解问题,那么为什么不尝试一下从前往后分解问题呢?
当我们人脑计算第5项时,首先计算第3项=第1项+第2项,之后计算第4项,最后得到第5项。
那么我们就可以修改代码为:
long long fib(int n,int n0,int n1){ if (n == 0) return n0; else if (n == 1) return n1;// 前两个数为终止情况 else return fib(n-1,n1,n0+n1); // 分解为子问题}int main(){ int n; while(1) { scanf("%d",&n); printf("The %dth item in the Fibonacci sequence is %lld.\n",n,fib(n,0,1)); } return 0;}“浅入快出”,简单入门快速理解,怎么感觉题目有点污
转载地址:https://blog.csdn.net/huzhiyuan0000000/article/details/73896491 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年03月22日 11时38分59秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
from scipy import misc 读取和保存图片
2019-04-26
关于Batch Normalization
2019-04-26
关于PGGAN
2019-04-26
后台挂起,让服务器运行,客户端崩溃也可以继续运行
2019-04-26
SQL中的token含义
2019-04-26
网络的权重初始化示例
2019-04-26
python的各种推导式
2019-04-26
集合的运算关系
2019-04-26
Python的位置参数、默认参数、可变参数(*args)、关键字参数(**kwargs)
2019-04-26
匿名函数lambda
2019-04-26
git上传代码到远程仓库的命令行步骤
2019-04-26
Android解决网络加载大图片OOM的问题
2019-04-26
设计模式之单例模式
2019-04-26
JAVA的引用类型
2019-04-26
Android 解决Dialog导致软键盘无法隐藏的问题
2019-04-26
初学Flutter--Assets资源文件
2019-04-26
Unity3d学习笔记
2019-04-26
自定义View简单实现图片的手指移动和两指缩放
2019-04-26