斐波那契(Fibonacci)数列

295 阅读1分钟

解析: 看到这题,菜得一逼的我马上想到的是用递归去做,毕竟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);
		}

	}
	


}

这样代码少了看着就爽多了,而且占的内存空间小了很多