递归及递归的简单运用之4种方法解斐波那契数列
来源:互联网 发布:ug高级仿真数控编程 编辑:程序博客网 时间:2024/06/06 08:57
什么是递归?
若一个对象部分的包含自己或用它自己给自己定义,那么我们说这个对象是递归的;若一个过程直接或间接的调用自己,那么这个过程是递归的。
递归的思想是把问题分解为规模更小具有与原问题相同解法的子问题,因此可以让我们思考的方式更加简单,程序也更加简练。不过就递归函数而言递归增加了压栈开销,因此空间复杂度比较高。
递归条件:
(1)、减小问题规模,并使子问题与原问题有相同解法。
(2)、设置出口,如果没有出口那么程序会一直递归下去。
递归的简单运用
斐波那契数列是递归问题中非常典型的一个了,我们常用循环的方式解斐波那契数列,循环解法:
long Fibonacci2(size_t N) //时间复杂度O(n),空间复杂度O(1){ long first = 1; long second = 1; long sum = 0; if (N < 3) return 1; else { for (size_t i = 3; i <= N; i++) { sum = first + second; first = second; second = sum; } return sum; }}
这种解法是比较高效的一种解法。
现在来看递归解法:
long Fibonacci1(size_t N) //时间复杂度O(2^N),空间复杂度O(n){ if (N < 3) return 1; else return Fibonacci1(N - 1) + Fibonacci1(N - 2);}
这种解法思维方式非常简单,但是时间复杂度特别高,一般不建议采用这种方法。
我们来看一种比较高效的递归解法:
long Fibonacci3(long first, long second, size_t N) //时间复杂度O(n),空间复杂度O(1){ if (N < 3) return second; else return Fibonacci3(second, first + second, N - 1);}
如果说前一种递归解法是由后向前计算,那么这种解法就是由前向后计算了,这种递归方式属于尾递归,因此在进行递归时函数只会使用第一次压栈所开辟的栈空间,在一个栈空间内循环,而不会开辟别的栈空间,所以这种方式时间复杂度为O(N),空间复杂度为O(1),是一种非常高效的递归方式。
除此之外还有一种递归解法:
long *Fibonacci4(size_t N) //时间复杂度O(n),空间复杂度O(n){ long *array = new long[N + 1]; if (N == 0) return NULL; array[0] = 0; array[1] = 1; for (size_t i = 2; i <= N; i++) { array[i] = array[i - 1] + array[i - 2]; } return array;}
这种递归解法并不比上一种方式高效,之所以写出来是因为这种递归方式是在一个代码块内递归,而不是上面那种函数的递归。
斐波那契数列解法非常多,在此仅给出4种解法。希望各位大神斧正。
阅读全文
1 0
- 递归及递归的简单运用之4种方法解斐波那契数列
- 斐波那契数列的递归及非递归
- 实现斐波那契数列的递归、非递归及尾递归。
- 斐波那契数列的递归与非递归求解方法&递归的优缺点
- 递归之斐波那契数列
- 递归之斐波那契数列
- 【递归】 之 菲波那契数列
- 递归之斐波那契数列
- 运用递归解决斐波那契数列
- 数据结构之用递归和非递归方法计算斐波那契数列的第n项
- 用递归和非递归的方法来求斐波那契数列
- C语言实现斐波那契数列的两种方法(递归和迭代)
- Java学习之旅--斐波那契数列的递归和非递归实现
- fibonacii数列(斐波那契数列)的递归实现及循环实现
- 递归之斐波那契数列java的三种写法
- 递归求斐波那契数列
- 递归求裴波那契数列
- 利用递归思想简单实现斐波那契数列
- 多线程下载文件(支持暂停、取消、断点续传)
- Caffe Loss 层
- PHP模拟post请求
- 黑白棋 简单对战
- mysql查询的时候报错
- 递归及递归的简单运用之4种方法解斐波那契数列
- React map items
- android 架构师知识图谱
- 用c语言输出九九乘法口诀表
- 对整型数字的处理(求位数,顺序打印,逆序打印)
- str1==str2和str1.equals(str2)的问题
- session与cookie的区别
- linux x86(64位/32位)系统 libevent 编译安装说明
- 《机器学习》第四章朴素贝叶斯分类器问题总结(python2.7->3.5)