zoukankan      html  css  js  c++  java
  • 【算法】斐波那契数列

    主要内容:

    1. 斐波那契数列(兔子问题)
    2. 递归算法和递推算法

    斐波那契数列(兔子问题)

    问题描述:刚出生的兔子,长到第三个月开始(忽略月份大小)就可以繁殖下一代。假如1月1日抱来一公一母两只兔子,那么3月1日时,就会生出第一代兔子,并且正好也是一公一母。假设兔子没有死亡,每代兔子都可以正常繁殖下一代,那么计算抱来一对兔子第N月时,兔子的总量是多少对。(刚抱来算第一个月)

    观察可知,从第三月开始,每个月的兔子总量等于前两个月的兔子总量之和,由此,便很容易确定其可以用斐波那契数列的思路来解决。

      公式:Fib(n)=Fib(n-1)+Fib(n-2),n>3

    现在来使用代码实现,我使用的是java来实现

    递归算法和递推算法

    package lucas;
    
    import java.util.Scanner;
    
    /**兔子问题<br/>
     * 问题描述:<br/>
     * 刚出生的兔子,长到第三个月开始(忽略月份大小)就可以繁殖下一代。<br/>
     * 假如1月1日抱来一公一母两只兔子,那么3月1日时,就会生出第一代兔子,并且正好也是一公一母。<br/>
     * 假设兔子没有死亡,每代兔子都可以正常繁殖下一代,
     * 那么计算抱来一对兔子第N月时,兔子的总量是多少对。(刚抱来算第一个月)
     * @author LENOVO
     *
     */
    public class Rabbit {
    	//递归,斐波那契数列
    	public static double Fib(double n){
    		if(n==1.0||n==2.0){
    			return 1.0;
    		}else{
    			return Fib(n-1.0)+Fib(n-2.0);
    		}
    	}
    	public static void main(String[] args) {
    		/*
    		 * 由题意可知,兔子序列从第三个月开始,
    		 * 每个月的数据是前两个月的和,所以很容易想到递归
    		 * 使用double(8字节)可以容纳很大的数字
    		 * 用递归很慢,只适合小一点的数字。
    		 * */
    		double f,n;
    		System.out.print("抱来兔子的第N月:");
    		Scanner sc=new Scanner(System.in);
    		n=sc.nextDouble();
    		System.out.print("当前兔子总量(对):");
    		f=Fib(n);
    		System.out.format("%.0f",f);
    	}
    
    }
    

      得到的结果(真的很慢):

    兔子的增长序列是斐波那契数列,所以考虑使用递推算法。

    递推算法要比递归速度快很多,空间占用也少很多。

    package lucas;
    
    import java.util.Scanner;
    
    /**兔子的增长序列是斐波那契数列,所以考虑使用
     * 递推算法。<br/>
     * 递推算法要比递归速度快很多,空间占用也少很多。
     * @author LENOVO
     *
     */
    public class Rabbit2 {
    
    	public static void main(String[] args) {
    		double f,n,i;
    		double a,b;//存储前2个月兔子总量
    		
    		System.out.println("抱来兔子的第n月:");
    		Scanner sc=new Scanner(System.in);
    		n=sc.nextDouble();
    		
    		a=b=f=1.0;
    		//从第3月才开始累加
    		for(i=3.0;i<=n;i++){
    			f=a+b;//计算第i月的数量
    			a=b;
    			b=f;
    		}
    		System.out.print("当前兔子总量(对)");
    		System.out.format("%.0f",f);		
    	}
    
    }
    

      结果显示(真的是秒速):

    参考自:http://www.cnblogs.com/kangjianwei101/p/5221542.html

  • 相关阅读:
    va_start、va_end、va_list的使用
    UNIX环境高级编程 apue.h头文件的配置
    Ant编译android程序
    Shell编程中Shift的用法
    命令生成和运行android项目
    ubuntu rar文件解压中文乱码问题
    SQLite区分大小写查询
    java命令执行jar包的方式
    ubuntu下安装与卸载软件方法
    linux下查看最后登陆的用户的信息
  • 原文地址:https://www.cnblogs.com/1906859953Lucas/p/9411153.html
Copyright © 2011-2022 走看看