分别使用迭代和递归打印斐波那契数列的前40个元素。
迭代使用的是循环结构,递归使用的是选择结构。
使用递归能让程序的结构更清晰 ,更简洁 ,更容易让人理解,从而减少代码阅读的时间。
但大量的递归调用会建立函数的副本,会消耗大量的内存和时间,而迭代则不需要此种付出。
我在运行程序的时候明显感觉到在后边递归打印的时候速度缓慢。
package com.yc.algorithm.recursion;
/**
* 迭代和递归实现斐波那契数列前40个输出
* @author yc
*/
public class Fibonacci {
public static void main(String[] args) {
System.out.println("迭代实现 : ");
fibonacciByIteration(40);
System.out.println("递归实现 : ");
for (int i= 0; i < 40; i++) {
System.out.print(fibonacciByRecursion(i));
System.out.print(" ");
}
}
/**
* 迭代实现
* @param num
*/
private static void fibonacciByIteration(int num) {
int[] f = new int[num];
f[0] = 0;
f[1] = 1;
System.out.print(f[0] + " " +f[1] + " ");
for (int i = 2; i < 40; i++) {
f[i] = f[i - 1] + f[i - 2];
System.out.print(f[i]);
System.out.print(" ");
}
System.out.println();
}
/**
* 递归实现
* @param num
* @return
*/
private static int fibonacciByRecursion(int num) {
if (num < 2) {
return num == 0 ? 0 : 1;
}
return fibonacciByRecursion(num - 1) + fibonacciByRecursion(num - 2);
}
}
输出如下:
迭代实现 :
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986
递归实现 :
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986