java语言求解兔子问题代码分析

1、思考

兔子问题,是费氏数列的形象化说法,它是由一位名为Fibonacci的数学家在它的著作中提出的一个问题。

2、描述

它体术的问题是:若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五只免子(小免子投入生产)......

我们使用数学的方式表达出来,便是下面的一组数列:

1、1、2、3、5、8、13、21、34、55、89......

注意:新生的小免子需一个月成长期才会投入生产!而且这些兔子是不死的哦!!!

3、规律

当我们莫名其妙的接触到这个问题的时候,很难找到其中的规律,但是依照数学中数列的规律去思考这个问题,等比?等差?还是其它什么?既然这是一个由数学家提出的问题,那么其中应该有一定的数学规律吧?到底是什么规律呢,仔细分析上面的一组数列,相比你已经有了答案了。没错,它用一句话来表述,从第三项开始,前面两项的和等于第三项。

假设第n项的数值为fn,那么该数列的规律性使用数学公式表达如下:

4、伪代码

所谓伪代码,就是不是真的代码,它并不能在机器上执行,只是一段介于自然语言和编程语言之间的一种表达程序逻辑的有意义的符号。对于兔子问题的伪代码,我们这里使用上述公式的递归方式,可以有以下的伪代码:

Procedure FIB(N) [
  IF (N < 0)
    PRINT ("输入错误");  

  IF (N = 0 OR N = 1)
    RETURN (N);
  ELSE
    RETURN ( FIB(N-1) + FIB(N-2) );
] 

根据之前文章所描述的递归概念,详细情况可以参考之前的《汉诺塔问题》,相比大家对递归已经不会太陌生,那么根据上述我们得到的数学公式,推演出这样的递归伪代码,会非常简洁明了。但是,额,可能大家猜到了,我要说但是。大家是否发现一个问题,当我们的n值过大的时候,程序会比较慢?

如果你发现了,说明你认真思考了这个问题,相比你也应该解决了心中的疑惑。如果还有没有解决疑惑的,就随着我来解决大家的疑惑。为什么会比较慢呢?原因在于,当我们计算后面的第n项的时候,需要再次计算n-1和n-2项,而这两项在之前都是已经被计算过了的,我们再求后面的一个数的时候,还是要在计算一边,无形之中,我们就多做了很多无用功。

那么,我们时候有好的方法去解决这个问题呢?答案是有的。根据上面的分析,当我们在求解第n项的时候,前面n-1和n-2项是已经求解过的,那么,为什么我们不把它存起来呀????

哈哈,有没有瞬间豁然开朗,对呀!我们这里是使用空间换时间,可以大大提高效率哦!这里我就不写伪代码了。

5、代码

好了,关子卖完了,直接上代码:

public class Fibonacci {
  public static void main(String[] args) {
    int[] fib = new int[20];  

    fib[0] = 0;
    fib[1] = 1;  

    for(int i = 2; i < fib.length; i++) {
      fib[i] = fib[i-1] + fib[i-2];
    } 

    for(int i = 0; i < fib.length; i++){
      System.out.print(fib[i] + " ");
    }
    System.out.println();
  }
} 

6、思考

这里,我们提出一个思考题,如果兔子它不是生一个兔子,生多个兔子,该怎么求解?当然,我们说的生多个就是定数,不会一个兔子生得多,一个兔子生的少,不然那样就没法求解了。

这里就不上代码了,大家可以自己在网上查找一下合适的资源,看看如何求解。

总结

以上就是本文关于Java语言求解兔子问题代码分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出!

(0)

相关推荐

  • Java语言求解完美数代码分析

    1.概念 首先我们理解一下,什么叫做完美数? 问题描述:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数.简称"完数" 例如, 6=1+2+3 28=1+2+4+7+14 496=1+2+4+8+16+31+62+124+248 8128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064 按照完数的定义,其实用程序求解完数并不是太难,先求解出这个数的所有真因子,然后相加,判断是否等于它本身即可.但是,在这个数

  • java使用回溯法求解数独示例

    复制代码 代码如下: import java.util.Calendar;import java.util.Date; public class Matrix { private int matrix[][]; private long timeAfter=0;  private long timeBefore =0; public Matrix(int m[][]) {  matrix = new int[9][9];  for (int i=0; i<9 ; i++)   for(int j

  • java打印正弦曲线示例

    复制代码 代码如下: /* * 绘制0°到360°的正弦曲线 * 分两种情形,y>0和y<=0进行绘制 * 每种情形中要考虑每行打印两个"*"字符 * 并在打印第二个"*"字符后换行 */package hundred;import java.lang.Math;public class SinTest {    public static void main(String[] args){     //y为列方向,值从1到-1,步长为0.1     f

  • Java编程用栈来求解汉诺塔问题的代码实例(非递归)

    [题目] 汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动过程和最优移动总步数. [解答] 上一篇用的是递归的方法解决这个问题,这里我们用栈来模拟汉诺塔的三个塔,也就是不用递归的方法 原理是这样的:修改后的汉诺塔问题不能让任何塔从左直接移动到右,也不能从右直接移动到左,而是要经过中间,也就是说,实际上能做的动作,只有四个:左->中,中->左,中->右,右->中 用栈

  • Java采用循环链表结构求解约瑟夫问题

    本文实例讲述了Java采用循环链表结构求解约瑟夫问题的方法.分享给大家供大家参考.具体分析如下: 这是第一次java考试的试题,对于没看过链表的同学来说就不会做,现在回头看看,还真不难. 约瑟夫问题: 有n个人,其编号分别为1,2,3,-,n.这n个人按顺序排成一个圈.现在给定s和d,从第s个人开始从1依次报数,数到d的人出列,然后又从下一个人开始又从1开始依次报数,数到d的人又出列,如此循环,直到最后所有人出列为止.要求定义一个节点类,采用循环链表结构求解约瑟夫问题. 以下java版的答案:

  • Java实现的n阶曲线拟合功能示例

    本文实例讲述了Java实现的n阶曲线拟合功能.分享给大家供大家参考,具体如下: 前面一篇文章Java实现求解一元n次多项式的方法,能解多项式以后,还需要利用那个类,根据若干采样点数据来对未来数据进行预测,拟合的矩阵在上一篇文章中已经贴出来了,这里就不说了,本篇主要是如何根据采样点来计算系数矩阵,并计算预测点的值. 原理很简单,公式在上一篇文章中也有了,此处直接贴代码. 其中用到了上一篇文章中写的类commonAlgorithm.PolynomiaSoluter package commonAlg

  • java求解汉诺塔问题示例

    思路如下: 要实现3阶汉诺塔的求解步骤,也就是说初始状态时,A上从上到下有三个盘子,分别为1号盘.2号盘和3号盘,其中1号盘最小,3号盘最大:判断剩余盘子个数,如果只有一个盘子就退出迭代,如果有大于一个盘子就继续迭代.代码如下: 复制代码 代码如下: public class HanoiTower {    public static void moveDish(int level, char from, char inter, char to) {        if (level == 1)

  • java 求解二维数组列最小值

    java 求解二维数组列最小值 比较二维数组列最小值,组成一个新数组返回. 实现核心算法,不需要使用IO 输入:{{5,6,1,16},{7,3,9}} 输出:{1,3} import java.util.Arrays; public class Col { public static int[] getColMin(int a[][]) { int[] res = new int[a.length]; for (int i = 0; i < a.length; i++) { int[] s =

  • Java实现求解一元n次多项式的方法示例

    本文实例讲述了Java实现求解一元n次多项式的方法.分享给大家供大家参考,具体如下: 项目需要做趋势预测,采用线性拟合.2阶曲线拟合和指数拟合的算法,各种线性拟合算法写成矩阵大概是这么个形式: 其中x是横坐标采样值,y是纵坐标采样值,i是采样点序列号,a是系数,N是采样点个数,n是阶数,所以线性拟合最后就转成了一个解高阶方程组的问题. 不知道有没有什么好用的java矩阵运算的包,我很不擅长搜集这种资料,所以只好捡起了已经放下多年的线性代数,自己写了个java程序用增广矩阵的算法来解高阶方程组.直

  • java分形绘制科赫雪花曲线(科赫曲线)代码分享

    首先我们举个例子:我们可以看到西兰花一小簇是整个花簇的一个分支,而在不同尺度下它们具有自相似的外形.换句话说,较小的分支通过放大适当的比例后可以得到一个与整体几乎完全一致的花簇.因此我们可以说西兰花簇是一个分形的实例.分形一般有以下特质:在任意小的尺度上都能有精细的结构: 太不规则,以至难以用传统欧氏几何的语言描述: (至少是大略或任意地)自相似豪斯多夫维数会大於拓扑维数: 有著简单的递归定义.(i)分形集都具有任意小尺度下的比例细节,或者说它具有精细的结构.(ii)分形集不能用传统的几何语言来

随机推荐