求斐波拉契数
斐波拉契数为,Fib(N) = Fib(N-1)+Fib(N-2) F(0)=F(1)=1 用Java编写能求Fib(N)的程序 输入为N,须输出Fib(N)
如输入
3
输出:
3
斐波那契数列,第一反应是用递归的方式写,f(n)=f(n-1)+f(n-2),但是写完提交后发现部分测试项运行超时。在递归时没有记录之前的结果,有大量的重复运算。
以f(4)为例。
f(4)=f(3)+f(2)
=f(2)+f(1)+f(1)+f(0)
=f(1)+f(0)+f(1)+f(1)+f(0)
递归方式:
import java.util.*;
public class Main {
public static long Fib(long n) {
if (n == 0 || n == 1)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n=in.nextInt();
in.close();
System.out.println(Fib(n));
}
}
优化的思路是采用for循环的形式,记录下之前两次的结果,能加快运算的速度:
import java.util.Scanner;
public class Main {
public static long Fib(long n) {
long f1 = 1;
long f2 = 1;
long fib = 0;
if (n == 0||n==1)
{
return 1;
}
else if(n>=2)
{
for (int i = 2; i <= n; i++)
{
fib = f1 + f2;
f1 = f2;
f2 = fib;
}
return fib;
}
else
return -1;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n = in.nextLong();
in.close();
System.out.println(Fib(n));
}
}
//有些平台测试数据较大所以变量使用long类型