1. Fibonacci数列
无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci数列。它可以递归地定义为:
第n个Fibonacci数可递归地计算如下:
int fibonacci(int n)
{
if (n <= 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
- 编写完整的主函数,分别记录利用上述递归函数求第45,46,47,48个Fibonacci数所花费的时间。
编码:
import java.util.Scanner;
public class Shulie {
public static void main(String[] args) {
Shulie sl=new Shulie();
Scanner scanner=new Scanner(System.in);
System.out.print(“输入一个数字为:”);
int x=scanner.nextInt();
long startTime=System.currentTimeMillis();
System.out.println(“输入一个数字的时间为:”+(startTime/1000)+”s”);
sl.fibonacci(x);
long endTime=System.currentTimeMillis();
System.out.println(“程序结束的时间为:”+(endTime/1000)+”s”);
System.out.println(“第”+x+”个Fibonacci数所花费的时间:”+((endTime-startTime)/1000)+”s”);
}
public int fibonacci(int n)
{
if(n<=1)return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
}
截图:
2).将递归函数改为尾递归,或者是递推函数,求第45,46,47,48个Fibonacci数所花费的时间,观察效率是否得到提高。
递推:
import java.util.Scanner;
public class Ditui {
public static void main(String[] args) {
Ditui dt=new Ditui();
Scanner scanner=new Scanner(System.in);
System.out.print(“输入一个数字为:”);
int y=scanner.nextInt();
long startTime=System.currentTimeMillis();
System.out.println(“输入一个数字的时间为:”+(startTime/1000)+”s”);
dt.fib(y);
long endTime=System.currentTimeMillis();
System.out.println(“程序结束的时间为:”+(endTime/1000)+”s”);
System.out.println(“第”+y+”个Fibonacci数所花费的时间:”+((endTime-startTime)/1000)+”s”);
}
long fib(int n)
{
long f1=1,f2=1,f3,i;
if(n<=2)
return 1;
for(f3=f1+f2,i=3;i<n;++i)
{
f1=f2;
f2=f3;
f3=f1+f2;
}
return f3;
}
}
截图:
2.
Description:
菲波那契数大家可能都已经很熟悉了: f(1)=0; f(2)=1; f(n)=f(n-1)+f(n-2) n>2。 因此,当需要其除以某个数的余数时,不妨加一些处理就可以得到。
Input:
输入数据为一些整数对P、K,P(1<P<5000),表示菲波那契数的序号,K(1<=K<15)表示2的幂次方。遇到两个空格隔开的0时表示结束处理。
Output:
输出其第P个菲波那契数除以2的K次方的余数。
Sample Input:
6 2
20 10
0 0
Sample Output:
1
85
代码:
import java.util.Scanner;
public class Yushu {
public static void main(String[] args) {
Yushu ys=new Yushu();
Scanner scanner=new Scanner(System.in);
System.out.print(“输入一个数字为:”);
int x=scanner.nextInt();
int y=ys.fibonacci(x);
System.out.println(“第”+x+”个Fibonacci数为:”+y);
System.out.print(“输入一个整数为:”);
int n=scanner.nextInt();
System.out.println(“第”+x+”个Fibonacci数的余数为:”+ ys.YS(y, n));
}
public int fibonacci(int n)
{
if(n==1) return 0;
else if(n==2) return 1;
else
return fibonacci(n-1)+fibonacci(n-2);
}
public double YS(int P,int K)
{
return P%Math.pow(2, K);
}
}
截图: