方法Ⅰ:递归调用实现
缺陷:每一次都从头开始计算,时间复杂度高
public class Demo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(scan.nextLine().trim());
System.out.println(fibonacci(n));
}
//传入参数n 返回值类型为long,防止溢出
public static long fibonacci(int n){
if(n == 1 || n == 2){
return 1;
}
else{
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
方法Ⅱ:非递归实现
import java.util.Scanner;
public class Main {
public static int fibonacci(int n){
if (n==1||n==2){
return 1;
}
else {
int a=1,b=1,c=0;
for (int i=3;i<=n;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
}
public static void main(String[] args) {
Scanner scan =new Scanner(System.in);
int n = Integer.parseInt(scan.nextLine().trim());
System.out.println(fibonacci(n));
}
}
结果求余题型
解法:每一次求fibonacci数均求余,无需先求出最终的fibonacci数再求余,直接计算余数比先算原数再求余效率高
import java.util.Scanner;
public class Main {
public static int fibonacci(int n){
if (n==1||n==2){
return 1;
}
else {
int a=1,b=1,c=0;
for (int i=3;i<=n;i++){
c=(a+b)%10007;
a=b;
b=c;
}
return c;
}
}
public static void main(String[] args) {
Scanner scan =new Scanner(System.in);
int n=scan.nextInt();
System.out.println(fibonacci(n));
}
}