本文介绍了递归的原理及其斐波那契数列的四种实现方式。
全部源码均已上传至github:连接git
比较经典的例子就是最知名的斐波那契数列了。本文也以斐波那契数列为例,先简单介绍一下,斐波那契数列(Fibonacci sequence),又称黄金分割数列(这个名字高大上)。程序员
指的是这样一个数列:一、一、二、三、五、八、1三、2一、3四、……
github
在数学上,斐波纳契数列以以下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。大体就是这样。
算法
这是最简单的递归,只有两行代码,是否是很简单呢?数组
public int recursion(int num) {
if (num < 3) return 1;
return recursion(num - 1) + recursion(num - 2);
}复制代码
可是这种实现的缺陷是重复计算的次数太多了,效率极其低下:缓存
F(3) = F(1) + F(2);bash
F(4) = F(2) + F(3);函数
F(5) = F(3) + F(4);测试
F(6) = F(5) + F(6);
优化
当计算到F(6)的时候,F(3)就已经重复了3次,所以改造一下:
public int recursion(int num) {
// 必定要先给出递归跳出条件
if (num < 3)
return 1;
// resCache是一个HashMap,key是num,value是res
if (resCache.containsKey(num)) {
return resCache.get(num);
}
int res = recursion(num - 1) + recursion(num - 2);
resCache.put(num, res);
return res;
}复制代码
ps:加一个hashMap来作缓存,避免重复计算
先简单了解一下什么是尾递归。
小知识(编译器优化):
public int tailRecursion(int num, int first, int second) {
if (num < 3)
return 1;
if (num == 3)
return first + second;
return tailRecursion(num - 1, second, first + second);
}复制代码
下面两种是非递归的实现,就比较简单了,在此不作阐述。
public int commonRcursion(int num) {
if(num < 3) return 1;
int first = 1;
int second = 1;
int res = 0;
for (int i = 1; i < num - 1; i++) {
res = first + second;
first = second;
second = res;
}
return res;
}复制代码
public int arrayRecursion(int num) {
if(num < 3) return 1;
int[] arrays = new int[num + 1];
arrays[1] = 1;
arrays[2] = 1;
for (int i = 3; i <= num; i++) {
arrays[i] = arrays[i - 1] + arrays[i - 2];
}
return arrays[num];
}复制代码
下一篇则分享程序员必会的五个排序。
您的点赞和关注是对我最大的支持,谢谢!