地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=13
Fibonacci数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地定义为
F(n)=1 ...........(n=1或n=2)
F(n)=F(n-1)+F(n-2).....(n>2)
现要你来求第n个斐波纳奇数。(第1个、第二个都为1)-
输入
-
第一行是一个整数m(m<5)表示共有m组测试数据
每次测试数据只有一行,且只有一个整形数n(n<20)
输出
- 对每组输入n,输出第n个Fibonacci数 样例输入
-
3 1 3 5
样例输出
-
1 2 5
-
第一行是一个整数m(m<5)表示共有m组测试数据
思路:
这道是金典的题目,感觉所谓金典,就是可以用不同的方法,从不同的方面将可以将其解决,做到举一反三的效果。
第一种方法:直接用递归。第二种方法:用一种叫记忆式搜索的递归,将重复递归的部分剪掉。第三种叫:所谓的动态规划(其实,到现在也不是很理解这个的。)
三种方法所耗的时间也是一个个地递减的。而且时间递减的数量级还很大。
直接上代码:
import java.util.Scanner;
/*
* 斐波那契数列
*/
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int m=cin.nextInt();
while(m-->0){
int n=cin.nextInt();
// System.out.println(f(n)); //第一种
int [] arr=new int[n+1];
// System.out.println(f(arr,n)); //第二种
System.out.println(f(arr)); //第三种
}
}
//526 184
public static int f(int n){
if(n==1||n==2)
return 1;
return f(n-1)+f(n-2);
}
//32 184
public static int f(int [] arr,int n){
if(arr[n]!=0)
return arr[n];
if(n==1||n==2)
return arr[n]=1;
return f(arr,n-1)+f(arr,n-2);
}
//22 184
public static int f(int [] arr){
int i=0;
int length=arr.length-1;
if(length==1||length==2)
return 1;
else{
arr[1]=1;
arr[2]=1;
}
for(i=3;i<arr.length;i++)
arr[i]=arr[i-1]+arr[i-2];
return arr[i-1];
}
}