JavaSE习题 斐波那契数列
题目描述:求斐波那契数列的第N项。
问题分析:
a.斐波那契数列:1 1 2 3 5 8 13......
b.根据观察我们可以发现这个数列的特征就是除了第一位和第二位数字以外,其余的都是前两项数字之和等于第三项。
方法一:递归
解题思路:a.所谓递归,首先要找到递归公式和终止条件。
One:终止条件:当数字(n)为第一位和第二位的时候便终止递归。
Two:递归公式:result = f(n-1)+f(n-2);
b.因此我们可以得出如果n=1或2,则返回数字1。其余数字则是使用递归公式得出结果。
所以我们可得到如下代码:
import java.util.Scanner;
public class TestDome {
public static int fun(int n){
if (n == 1 || n == 2) {
return 1;
}
return fun(n -1) +fun( n -2);
}
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int a =scanner.nextInt();
System.out.println( fun(a));
}
}
运行结果如下:
注意:因为每次递归都是占用内存的,所以你会发现当N的值过于大的时候,程序执行速度极慢。
原因是进行了大量的重复运算,因此我们可以使用循环的方法来求斐波那契数列,避免出现冗余运算。
方法二:循环
解题思路: 根据观察我们可以发现这个数列的特征就是除了第一位和第二位数字以外,其余的都是前两项数字之和等于第三项。
所以,我们可以用循环不断的将前两位相加,直到加到n为止。
但需要注意的是,因为第一位与第二位都是1,所以我们可以把它们固定为1不变,让循环从第三位开始运算。
所以我们可得到如下代码:
import java.util.Scanner;
public class TestDome {
public static int fun(int n){
int i =1;
int j =1;
int z =0;
for (int k = 3; k <=n; k++) {
z = i + j;
i = j;
j = z;
}
return z;
}
public static void main(String[] args) {
System.out.println("请输入数字N");
Scanner scanner =new Scanner(System.in);
int a =scanner.nextInt();
System.out.println( fun(a));
}
}
运行结果如下:
注意:此时程序的执行效率大大提高了。