斐波那契数列(Fibonacci sequence),又称黄金分割数列、兔子数列,是数学家列昂纳多·斐波那契于1202年提出的数列。
斐波那契数列为1、1、2、3、5、8、13、21、34……此数列从第3项开始,每一项都等于前两项之和,递推公式为F(n)=F(n-1)+F(n-2),n≥3,F(1)=1,F(2)=1。
递归代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//递归实现
int Fib(int n) {if (n == 1) {return 1;}if (n == 2) {return 1;}return Fib(n - 1) + Fib(n - 2);
}int main() {int num = 0;printf("请输入您要求出的数:\n");scanf("%d", &num);printf("第%d个数的值为:%d\n", num, Fib(num));system("pause");return 0;
}

运行结果:

非递归实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//非递归实现
int Fib2(int n) {if (n == 1) {return 1;}if (n == 2) {return 1;}int last1 = 1;int last2 = 1;int current = 0;for (int i = 3; i <= n; i++) {current = last1 + last2;last2 = last1;last1 = current;}return current;
}
int main() {int num = 0;printf("请输入您要求出的数:\n");scanf("%d", &num);printf("第%d个数的值为:%d\n", num, Fib(num));system("pause");return 0;
}

运行结果:

我的理解:
递归方法实现斐波那契数列就是先定义出口,即当n=1时,Fib(1)=1;和当n=2时,Fib(2)=1,当n>=3时就有Fib(n)=Fib(n-1)+ Fib(n-2)即在此过程中通过调用自身的函数即Fib()得到Fib(n-1)和Fib(n-2)的值实现相加求和,在这一过程中先判定n-1是否等于1或2,如果不等于则Fib(n-1)=Fib(n-2)+ Fib(n-3)同理,Fib(n-2)=Fib(n-3)+ Fib(n-4)直至到Fib(1)或Fib(2)时结束通过返回值相加来计算上一个数的值。从Fib(n)到Fib(1)是递的过程,而两个返回值相加,直至计算出Fib(n)的过程便是归。以5为例,下图表明过程。

注意事项:递归实现虽然代码较简单,但执行次数过多时会导致输出结果时间过长,而且还存在浪费空间的问题。
非递归方法实现可以有效解决输出结果时间过长的问题,但理解起来不是很容易,首先和递归一样如果n为1或2,直接返回结果1,当n>=3时,通过设置两个变量last1和last2来保存数列的前两项以及设置变量current表示当前项,(last1表示倒数第一项,last2表示倒数第二项)设计循环,循环体内令current=last1+last2再加上更新语句current=last1,last2=last1;即可实现。

通过循环实现,可以缩短程序运行时间,当n取100时相比于递归方法,循环方法只运行了约100次,而递归则运行2的100次方次。

斐波那契数列的递归和非递归实现相关推荐

  1. python编写递归函数和非递归函数、输出斐波那契数列_分别用非递归和递归的方法编写函数求斐波那契数列第n项。斐波那契数列1,1,2,3,5,8,13,…...

    展开全部 /** 已知Fibonacci数列:1,1,2,3,5,8,--,F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2) */ #include #include typedef ...

  2. 斐波那契数列的实现(简单递归和动态规划)

    斐波那契数列的实现(简单递归和动态规划) 一.简单递归的实现 1 #include "stdafx.h" 2 #include <string> 3 using nam ...

  3. 斐波那契数列的递推与递归求法

    斐波那契数列的递推与递归求法: OVERVIEW 斐波那契数列的递推与递归求法: (1)递推求Fibonacci: (2)递归求Fibonacci: (3)递归求Fibonacci(记忆化数组优化): ...

  4. 递归算法(python),汉诺塔问题,斐波那契数列,一个简单的递归实例,用递归实现阶乘,用递归查看目录及文件

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请 ...

  5. 斐波那契数列(一)--对比递归与动态规划(JAVA)

    兔子繁殖问题: 这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子.小兔子长到第3个月后每个月又生一对兔子.按此规律,假设 ...

  6. 【C语言】斐波那契数列(Fibonacci sequence)递归实现 和 非递归实现

    目录 斐波那契数列 引出 C语言代码实现--递归 C语言代码实现--非递归 斐波那契数列 引出 斐波那契数列的应用十分广泛,这里不再列举. C语言代码实现--递归 同时也有许多种代码实现方式,这里仅列 ...

  7. 斐波那契数列的递归算法与非递归算法

    一.斐波那契数列 由于斐波纳挈数列是以兔子的繁殖引入的,因此也叫"兔子数列".它指的是这样一个数列:0,1,1,2,3,5,8,13......从这组数可以很明显看出这样一个规律: ...

  8. 递归函数斐波那契数列python_使用Python函数递归实现斐波那契数列时为什么运行速度很慢?...

    你看看你递归代码的复杂度 是O(2^n) 而第二个的复杂度是O(n) 运行效率当然不同 COUNTER = 0 def fibn(n): global COUNTER COUNTER += 1 if ...

  9. 斐波那契数列 C语言 数组 非数组 函数

    非数组 递推 #include<stdio.h> int main() {long long n,a=1,b=1,s=0,i;scanf("%lld",&n); ...

  10. C#,斐波那契数列(Fibonacci Sequence)的八种算法与源代码

    一.莱昂纳多·斐波那契(Leonardo Fibonacci) 斐波那契公元1170年生于意大利比萨,卒于1250年,被人称作"比萨的莱昂纳多",是一名闻名于欧洲的数学家,其主要的 ...

最新文章

  1. linux刷新指定URL脚本,【图片】linux下crontab定时执行本地脚本和定时访问指定url【不要牧师吧】_百度贴吧...
  2. biopython安装_BioPython的安装和使用
  3. 苹果推出开源医学研究框架ResearchKit
  4. java 原生sql批量插入,Java对象集合转MySQL批量插入语句
  5. Python第一次写的代码
  6. 文件传输:二进制文件传输与文本传输(file transfer)
  7. 消费者最关心的就是你的用户体验,以及保证产品品质,保证价格和服务
  8. 柠檬汁制成的电池可以开动超100千克的车子吗?
  9. 万字总结!java让字符串反转
  10. Oracle RDA(Remote Diagnostic Agent) 工具说明
  11. ES6异步编程: co函数库的含义与用法
  12. OSPF中 HELL0包解析
  13. 数据集的非均衡问题(imbalanced data)和应对方法
  14. 长沙理工大学c语言编程题,长沙理工大学2014年上期期末c语言编程题库.doc
  15. 微pe工具箱 系统安装教程_装系统必备 微PE工具箱制作启动U盘教程
  16. B46 - STM32太阳能充电智能心率监测骑行仪
  17. 【Twitter 舆论分析】Twitter 爬虫绕过API限制
  18. MLIR深入 —— 转换流程详解(以Toy接入为例)
  19. bzoj1022: [SHOI2008]小约翰的游戏John 博弈
  20. 路由器界面html模板,前端路由一探

热门文章

  1. MySQL 一条sql添加多个索引或添加多个列(字段)
  2. java游戏主角叶开,《仙侠道》叶开深度解析
  3. 生成器 生成器函数 各种推导式 生成器表达式
  4. 淘宝商品信息存入数据库
  5. echarts使用细节
  6. 俄罗斯方块 C/C++ 效果展示
  7. 计算机毕业设计论文_java项目的汽车租赁网|租车
  8. 挡板java_java小程序挡板接小球
  9. linux系统查看日志文件常用命令
  10. 利用约束布局ConstraintLayout实现全适配九宫格