实验I:体验神奇的算法
本实验要求根据给定的正整数n计算第n个斐波那契数。课堂上已经讲过4种不同的算法,请选择自己最熟悉的编程语言实现这些算法来体验算法求解问题的神奇,下列基本要求必须完成:
- 设计一个交互界面(例如菜单)供用户选择,如果可能,最好是一个图形化用户界面。
- 利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第几个斐波那契数。(Java: 231-1 for int, 263-1 for long)
- 根据第二步计算的最大的斐波那契数序号n,采用递归方式计算第n个斐波那契数,看其是否可以在1分钟内完成。
- 利用递归算法计算你的计算机能够在30秒内计算出的最大斐波那契数是第几个,计算出下一个斐波那契数的时间是多少,利用迭代算法求解同样的问题。
- 利用公式F(n) = [fn/sqrt(5)]快速计算第n个斐波那契数,找出出现误差时的最小n值。
- 利用矩阵相乘方法计算第n个斐波那契数。
- 对于相同的输入n值,比较上述四种方法的基本操作次数,以掌握对数、线性和指数增长率的极大差别。
Algorithm.java
package com;
//四种算法
public class Algorithm {
//递归算法
public static int fibonacciRecursive(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
} else {
return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
}
}
//迭代算法 O(n)
public static int fibonacciIterative(int n) {
if (n <= 1) {
return n;
}
int a = 0;
int b = 1;
for (int i = 2; i < n; i++) {
int temp = a;
a = b;
b = temp + b;
}
return b;
}
//迭代算法计算最大的斐波那契数
public static int Max_fibonacciIterative() {
long maxFib = 0;
int index = 0;
long a = 0;
long b = 1;
while (a <= 2147483647L) { // 对于int类型
// while (a <= 9223372036854775807L) { // 对于long类型
maxFib = a;
index++;
long temp = a;
a = b;
b = temp + b;
}
return index;
}
//公式计算
//计算误差最小的数,误差为1
public static int calculateFibonacci_min() {
double sqrt5 = Math.sqrt(5);
double phi = (1 + sqrt5) / 2;
double error = 1.0;
for (int n = 1; ; n++) {
double fibonacci = (Math.pow(phi, n) - Math.pow(-phi, -n)) / sqrt5;
double realFibonacci = calculateFibonacci1(n);
if (Math.abs(fibonacci - realFibonacci) > error) {
return n;
// break;
}
}
}
//真实的阿波期数
public static double calculateFibonacci1(int n) {
if (n <= 2) {
return 1;
}
double a = 1, b = 1;
for (int i = 3; i <= n; i++) {
double c = a + b;
a = b;
b = c;
}
return b;
}
//公式计算 O(1)
public static double calculateFibonacci(int n) {
double sqrt5 = Math.sqrt(5);
double phi = (1 + sqrt5) / 2;
return (Math.pow(phi, n) - Math.pow(-phi, -n)) / sqrt5;
}
//快速矩阵算法 O(logn)
public static int fibonacciMatrixPower(int n){
int x=0,y=1,