对比 | 简介 | 优点 | 缺点 |
递归 | 函数自己调用自己 | 结构简单,容易理解 | 空间复杂度高,容易在成堆栈溢出 |
迭代 | 函数中某段代码循环,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。 | 结构复杂 | 空间复杂度低 |
总结 | 大多数情况下,两者能够相互转换,能用迭代的不要用递归 |
以 裴波那契数列 的实现为例。1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F1=1,F2=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。
// 递归实现方式
public static int fibonacci(int n){
if(n <= 2){
return 1;
}else{
return fibonacci(n-1) + fibonacci(n-2);
}
}
// 递推实现方式
public static int fibonacciNormal(int n){
if(n <= 2){
return 1;
}
int n1 = 1, n2 = 1, sn = 0;
for(int i = 3; i <= n; i ++){
sn = n1 + n2;
n1 = n2;
n2 = sn;
}
return sn;
}