递归与分治(1)

 1.  Fibonacci数列

   无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci数列。它可以递归地定义为:

《递归与分治(1)》

第n个Fibonacci数可递归地计算如下:

int fibonacci(int n)

   {

       if (n <= 1) return 1;

       return fibonacci(n-1)+fibonacci(n-2);

   }

  1. 编写完整的主函数,分别记录利用上述递归函数求第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);

}

 

}

截图:

《递归与分治(1)》

    

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;

}

}

截图:

 《递归与分治(1)》

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);

}

}

截图:

    《递归与分治(1)》

    

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/zrx1832/article/details/83316956
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞