java-算法Fibonacci序列

本文介绍四种不同的斐波那契数列实现方法:递归、时间换空间、空间换时间和数组方法。每种方法都有其适用场景,如递归适用于理解原理,而空间换时间则适合频繁调用的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.递归的方法

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;  
     }  
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值