斐波那契数列
形如 1 1 2 3 5 8 13 这样的数列成为斐波那契数列,数学公式表示即使f(0) = 1, f(1) = 1, f(n) = f(n-1) + f(n-2)
代码实现(递归和非递归)
public class Fib {
//递归实现
public static int fibByRecursive(int n) {
//递归要确定好出口条件
if (n == 1 || n == 2) return 1;
return fibByRecursive(n - 1) + fibByRecursive(n - 2);
}
//非递归实现(传统写法)
public static int fibConvention(int n) {
if (n == 1 || n == 2) return 1;
int a = 1;
int b = 1;
int fin = 0; //用来存储中间结果
for (int i = 3; i <= n; i++) {
fin = a + b;
a = b;
b = fin;
}
return fin;
}
//非递归实现(动态规划)
public static int fib(int n) {
if (n == 1 || n == 2) return 1;
//用数组来存储计算结果
int[] mid = new int[n];
mid[0] = 1;
mid[1] = 1;
for (int i = 3; i <= n; i++) {
mid[i - 1] = mid[i - 2] + mid[i - 3];
}
return mid[n - 1];
}
public static void main(String[] args) {
int size = 20;
System.out.print(" 递归方法:");
for (int i = 1; i <= size; i++) {
System.out.print(fibByRecursive(i) + " ");
}
System.out.println();
System.out.print(" 传统非递归:");
for (int i = 1; i <= size; i++) {
System.out.print(fibConvention(i) + " ");
}
System.out.println();
System.out.print(" 动态规划:");
for (int i = 1; i <= size; i++) {
System.out.print(fib(i) + " ");
}
System.out.println();
}
}
运行结果
递归方法:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
传统非递归:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
动态规划:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765