递归和非递归方法实现斐波那契
2016-06-11 18:52
162 查看
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
斐波那契递归算法实现。
斐波那契递归算法实现。
//递归实现斐波那契 long long Fibonacci(int n) { //if (n == 0 || n == 1) // return n; //else // return Fibonacci(n - 1) + Fibonacci(n - 2); return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2); }由于斐波那契递归算法时间复杂度:O(2^N)空间复杂度为:O(N),下面通过非递归实现斐波那契。
//非递归实现斐波那契-------时间复杂度O(n),空间复杂度O(n) long long Fibonacci(int n) { long long *fibonacci = new long long[n + 1];//注意此处开辟n+1个空间 fibonacci[0] = 0; fibonacci[1] = 1; for (int i = 2; i <= n; i++) { fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2]; } long long ret = fibonacci ; delete[] fibonacci; return ret; } //非递归实现斐波那契--迭代法-------时间复杂度O(n),空间复杂度O(1) long long Fibonacci(int n) { long long fibonacci[3] = { 0, 1, n }; fibonacci[0] = 0; fibonacci[1] = 1; for (int i = 2; i <= n; i++) { fibonacci[2] = fibonacci[1] + fibonacci[0]; fibonacci[0] = fibonacci[1]; fibonacci[1] = fibonacci[2]; } return fibonacci[2]; } //非递归实现斐波那契--迭代法-------空间复杂度O(n),时间复杂度O(1) long long Fibonacci(int n) { long long result; long long pre_result; long long next_pre_result; next_pre_result = 0; pre_result = 1; result = 0; while (n > 0) { next_pre_result = pre_result; pre_result = result; result = next_pre_result + pre_result; n--; } return result; }本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1758144
相关文章推荐
- 字符串中查找子串
- 实现大数四则运算
- 一个数组实现两个栈
- 迷宫问题
- mongodb的基本操作与插入文档(document)
- 360
- 经典问题之最大子矩阵
- 判断一个字符串是否为另外一个字符串旋转之后的字符串
- 字符串和对应的整数之间的转换
- 编写一个函数itob(),将整数n转换为以b进制的数,保存到s中
- 二维数组中的查找—杨氏矩阵
- 编写一个函数将参数字符串中的字符反向排列
- 在终端输入多行信息,找出包含“ould”的行,并打印改行
- 编写冒泡排序,排序一个整形数组
- 模拟实现printf
- 调整数组使奇数全部都位于偶数前面
- 找出数组中两个只出现了一次的数
- 实现常用字符串处理函数(不调用库函数)
- strlen函数的多种实现方式
- 编写冒泡排序,可以排序整形数组,也可以排序字符串