递归有时确实是一个解决问题最为直接的方法,但是递归也要有一定的策略,就那斐波那契序列为例
一般我们总容易想到的一种方法是
import java.util.Scanner;
public class Fibonacci {
public static void main(String[] args){
System.out.println("输入一个正整数:");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
long start=System.currentTimeMillis();
System.out.println(fibo(n));
long end=System.currentTimeMillis();
System.out.println(end-start);
}
public static int fibo(int n){
if(n<=2)return 1;
else return fibo(n-1)+fibo(n-2);
}
}
虽然这种方法很容易被想到,但是却耗费了很多的时间,有很多都需要重复计算,但是如果可以将已经计算过的记录下来,下次再使用的时候就不会耗费很多的时间,只需要直接提取就可以了,下面的代码即为修改过的求斐波那契序列的方法:
import java.util.Scanner;
public class Fibonacci {
private static int[] arr = new int[100];
public static void main(String[] args) {
System.out.println("输入一个正整数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long start = System.currentTimeMillis();
System.out.println(fibo(n));
long end = System.currentTimeMillis();
System.out.println(end - start);
}
public static int fibo(int n) {
arr[0] = arr[1] = 1;
if (n == 1)
return arr[n - 1];
if (n == 2)
return arr[n - 1];
for (int i = 3; i <= n; i++) {
arr[i - 1] = arr[i - 2] + arr[i - 3];
}
return arr[n - 1];
}
}