java-算法Fibonacci序列

一.递归的方法

import java.util.Scanner;  
public class Fibonacci{   
    public static void main(String[] args) {  
            Scanner sc = new Scanner(System.in);  
            System.out.println("请输入一个大于零的整数:");  
            int n = sc.nextInt();  
            System.out.println("斐波那契数列为:");  
            for (int j = 0; j <= n; j++) {  
                System.out.print(fibonacci(j)+"  ");  
            }  
            //sc.close();  
        }   
        private static int fibonacci(int n) {
            if(n==0)
            {
                return 0;
            }else if(n==1||n==2)
            {
                return 1;
            }
            else if(n>2)
            {
                int temp=fibonacci(n-1)+fibonacci(n-2);
                return temp;
            }
            return n;
        }  

    }  

这里写图片描述
此种方式缺点:大量迭代不断消耗栈空间(搞web开发调试维护的都应该知道服务器栈资源的可贵,如果大量并发调用迭代导致服务器栈资源迟迟得不到回收,而导致web服务器崩溃),效率底,函数自闭性比较弱(优秀的接口应该对输入输出可能出现的错误信息进行捕捉,并提供清楚明了的处理结果),很容易出现错误,调试困难,实际应用中一般不建议使用这种方式,使用时迭代次数也不能超过3次;
二.时间换空间

import java.util.Scanner;  
public class Fibonacci{   
    public static void main(String[] args) {  
            Scanner sc = new Scanner(System.in);  
            System.out.println("请输入一个大于零的整数:");  
            int n = sc.nextInt();  
            System.out.println("斐波那契数列为:");  
            for (int j = 0; j <= n; j++) {  
                System.out.print(fibonacci(j)+"  ");  
            }  
        }   
        private static int fibonacci(int n) {

            int result=-1;
            int temp1=0;
            int temp2=1;
            for(int index=0;index<=n;index++){
            if(index==0)
            {
            result=temp1;
            }else if(index==1)
            {
            result=temp2;      
            }else{
                    result=temp1+temp2;
                    if(result<0){
                     result=-2;
                     break;
                    }
                    temp1=temp2;
                    temp2=result;
                   }
                  }
                  return result;
        }  

    } 

此方法主要使用于:使用场景一:对于对象或变量使用次数比较少,使用一次以后就不会再使用的场景;使用场景二:对于内存资源比较稀缺的实时性要求不是太高的嵌入式系统设计中多会采用此种方式;
三.空间换时间
此方法一般用于:对象或变量在程序运行的整个生命周期都存在或频繁调用的场景,如调用外部WebService接口、抽象持续化层、常用配置文件参数加载等等。


import java.util.ArrayList;
import java.util.List;

public class Fibonacci {
     private static List<Integer> fnData=new ArrayList<Integer>();
     private static final int maxSize=50000;
     /**
      * 初始化器
      */
     private static void setFnData(){
      int result=-1;
      int temp1=0;
      int temp2=1;
      for(int index=0;index<=maxSize;index++){
       if(index==0){
        result=temp1;
       }else if(index==1){
        result=temp2;
       }else{
        result=temp1+temp2;
        if(result<0){
         result=-2;
         break;
        }
        temp1=temp2;
        temp2=result;
       }
       fnData.add(result);
      }
     }
     /**
      * 对外接口
      */
     public int getFnData(int n){
      if(fnData.size()==0){
       setFnData();
      }
      if(fnData.size()>n&&n>=0){
       return fnData.get(n);
      }else{
       return -1;
      }
     }
     public static void main(String[] argv){
         Fibonacci init=new Fibonacci();
          int n=8;
          for(int i=0;i<=n;i++)
          System.out.print (init.getFnData(i)+"  ");
         }
        }

四.数组的方法实现

    public class Fibonacci_1{
    public static void main(String[] args) {  
      int[] is = f(10);  
      for(int i : is)  
       System.out.print(" "+i);  
     }  

     // 输入长度,得到数组  
     public static int[] f(int length) {  
      if (length < 2)  
       return null;  
      int[] fs = new int[length];  
      fs[0] = 1;  
      fs[1] = 1;  
      for (int i = 2; i < length; i++) {  
       fs[i] = fs[i-1] + fs[i-2];  
      }  

      return fs;  
     }  
     }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法分析基础——Fibonacci序列问题 分治法在数值问题中的应用——最近点对问题 减治法在组合问题中的应用——8枚硬币问题 变治法在排序问题中的应用——堆排序问题 动态规划法在图问题中的应用——全源最短路径问题 3. 实验要求 (1)实现Floyd算法; (2)算法的输入可以手动输入,也可以自动生成; (3)算法不仅要输出从每个顶点到其他所有顶点之间的最短路径,还有输出最短路径的长度; (4)设计一个权重为负的图或有向图的例子,对于它,Floyd算法不能输出正确的结果 3. 实验要求 1)设计与实现堆排序算法; 2)待排序的数据可以手工输入(通常规模比较小,10个数据左右),用以检测程序的正确性;也可以计算机随机生成(通常规模比较大,1500-3000个数据左右),用以检验(用计数法)堆排序算法的时间效率 3. 实验要求 1)设计减治算法实现8枚硬币问题; 2)设计实验程序,考察用减治技术设计的算法是否高效; 3)扩展算法,使之能处理n枚硬币中有一枚假币的问题。 3. 实验要求 1)使用教材2.5节中介绍的迭代算法Fib(n),找出最大的n,使得 第n个Fibonacci数不超过计算机所能表示的最大整数,并给出具体的执行时间; 2)对于要求1),使用教材2.5节中介绍的递归算法F(n)进行计算,同样给出具体的执行时间,并同1)的执行时间进行比较; 3)对于输入同样的非负整数n,比较上述两种算法基本操作的执行次数; 4)对1)中的迭代算法进行改进,使得改进后的迭代算法其空间复杂度为Θ(1); 5)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值