解析: 看到这题,菜得一逼的我马上想到的是用递归去做,毕竟f(n)=f(n-1)+f(n-2)的形式和递归完美的切合,但是我忽略的数据规模。递归的优点是简洁和思路清晰,但是缺点也很明显,就是每次调用自身的方法都需要重新开辟出一片空间,相当于把一个问题分解成了n个问题去求解,这样当数据大的时候就要花很多时间甚至得不到最后的结果。
用最笨的for循环去做很愉快的解决了问题。一开始我是用数组的方式去做的。
package _3_5_test;
import java.util.Scanner;
/*Fibonacci数列
*
*/
public class FiftyThree {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int num[] = new int[n];
num[0] = 1;
num[1] = 1;
int count = 2;
while (count < n) {
num[count] = (num[count - 1] + num[count - 2]) % 10007;
count++;
}
if(n<3) {
System.out.println("1");
}else {
System.out.println(num[count - 1]);
}
}
}
这样虽然运行速度也还可以,但是当一个数据很大的时候,数组也需要开辟一个很大的空间,这些空间都是一次性了,这样就有点浪费内存。再仔细看看其实每次的运算就只是在三个数之间转来转去,运算完后这几个数都是可以重复利用的。我又用实数的方式试了一遍
package _3_5_test;
import java.util.Scanner;
/*Fibonacci数列
*
*/
public class FiftyThree {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int a = 1, b = 1;
int c = 0;
for (int i = 3; i <= n; i++) {
c = (a + b)%10007;
a = b;
b = c;
}
if (n < 3) {
System.out.println(a);
} else {
System.out.println(c);
}
}
}
这样代码少了看着就爽多了,而且占的内存空间小了很多