斐波那契数列(Fabonacci)兔子练习题

Java练习题:兔子问题

      此问题又叫斐波那契数列(Fabonacci),是最先研究这个数列的人是比萨的列奥那多(又名费波那契),他描述兔子生长的数目时用上了这数列。

  • 第一个月有一对刚诞生的兔子
  • 第二个月之后它们可以生育
  • 每月每对可生育的兔子会诞生下一对新兔子
  • 兔子永不死去

       假设在 n 月有新生及可生育的兔子总共 a 对,n+1 月就总共有 b 对。在 n+2 月必定总共有 a+b 对: 因为在 n+2 月的时候,所有在 n 月就已存在的 a 对兔子皆已可以生育并诞下 a 对后代;同时在前一月(n+1月)之 b 对兔子中,在当月属于新诞生的兔子尚不能生育。参照下表:


所经过的月数


1


2


3


4


5


6


7


8


9


10


11


12


新诞生的兔子


0


0


1


1


2


3


5


8


13


21


34


55


兔子对数


1


1


2


3


5


8


13


21


34


55


89


144

由此可用数学归纳法定义为:

    F(n) = F(n-1)+F(n+1);(n>2,F(1)=1,F(2)=1);

如果我们用普通的迭代方法该怎么样实现呢?假设我们要打印12个月兔子的对数,代码如下:

	public static void main(String args[]) {

		int R[] = new int[12];  //每月的兔子数

		R[0] = 1;  //第一月份的兔子数

		R[1] = 1;  //第二月份的兔子书

		for (int a = 2 ; a < 12; a++) {
			R[a] = R[a-1] + R[a-2];
			System.out.println(R[a]);
		}
	}

代码很简单,用数组实现,但我们如果用递归的话,代码更加简洁:

	public static void main(String args[]) {
		System.out.println(Fbi(12)); //打印
	}

	static int Fbi(int i) {
		if (i < 2) return i==0?0:1;
		return Fbi(i-1) + Fbi(i-2); //自己调用自己的函数
	}

递归的另外一种晦涩点的写法:

package com.zzk.cn;

/***
 * 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子
 * 假如兔子都不死,每个月的兔子总数为多少?
 * @author zhuzhengke
 *
 */
public class test01 {
    public static void main(String[] args) {
    	testnumber(5);
    }

    public static void  testnumber(int i) {
    	System.out.println("第一个月的兔子对数: 1");
    	System.out.println("第二个月的兔子对数: 1");
    	int f1=1,f2=1,f,M=24;
    	for(int k=3;k<=M;k++)
    	{
    		f=f2;
    		f2=f1+f2;
    		f1=f;
    	System.out.println("第"+ k+"个月的兔子对数:"+f2);
    	}
    }
}
时间: 2024-09-10 22:10:36

斐波那契数列(Fabonacci)兔子练习题的相关文章

斐波那契数列-有一对兔子

/************************************************************************************************  题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,*  小兔子长到第三后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? *  1.程序分析: 兔子(对)的规律为数列1,1,2,3,5,8,13,21....* @param args* [斐波那契数列]*********

斐波那契数列和反向计算问题

反向计算:编写一个函数将一个整型转换为二进制形式 反向计算问题,递归比循环更简单 分析:需要理解,奇数的二进制最后一位是1,偶数的二进制最后一位一定是0,联想记忆,这个和整型的奇偶性是一致的,1本身就是奇数,0本身是偶数.     十进制整数转换为二进制整数采用"除2取余,逆序排列"法. 具体做法是:用2整除十进制整数,可以得到一个商和余数,再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,

java-关于斐波那契数列的求和问题的解答

问题描述 关于斐波那契数列的求和问题的解答 .有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,....;求Java程序代码 解决方案 斐波那契数列及其求和 解决方案二: a[i]=a[i-1]+a[i-2]就行了呗,java难道难写吗 解决方案三: public class Test { public static void main(String[]

递归解决斐波那契数列

1.什么是递归? 递归:递归是方法定义调用方法本身的现象.递归举例如下: <span style="font-size:14px;">public class DiGuiDemo { //递归方法举例 public void show() { show(); } } </span> 2.递归的注意事项? (1)递归一定要有出口.否则就会死递归. 上面举例用的递归就是一个死递归,方法永远都在进行自身调用,最终一定会陷入内存崩溃.所以递归要定义出口,就是结束递归的条

【数学题】斐波拉契数列!

兔子的繁殖能力很强,一对兔子每过一个月会生一对小兔子.而刚出生的一对小兔子经过一个月后长大,再过一个月生出一对小兔子.如果从刚生的一对兔子算起,一年后总共有多少对兔子? 答案:233对.每个月结束时,兔子的对数:1  12  23  34  55  86  137  218  349  5510 8911 14412 233设数列{An}={1,2,3,5,8--}={A1,A2--An-1,An}.则An=An-1+An-2(下标)第n月结束时兔子对数=n-1月兔的对数+新生兔子对数.新生兔对

hdu 4549 M斐波那契数列

click here ~~ Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n

用PHP迭代器来实现一个斐波纳契数列

斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解的. <?php /* *@author nicesunboy@gmail.com */ class Fibonacci implements Iterator { private $previous = 1; private $current = 0; private $key = 0; publ

输出斐波那契数列的算法

斐波那契数列(Fibonacci polynomial),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.-- 要求编程输出这样的一组数,比如输出10个数的序列 /** * @param i 第n个数 * @param j 第n+1个数 * @param n 输出个数 */ public static void ff( int i,int j,int n){ int m=1; System.out.print(i+","); while(m++<n)

打印菱形以及斐波纳契数列的几种解法介绍

1.编写程序,打印*菱形推出第i行要打印的空白个数及*号个数,用for循环依次打印各行 复制代码 代码如下: #include<stdio.h> //总共要打印2*n-1行,逐行打印 void print1(int n) { int i,j; for(i=1;i<=n;i++){//打印1至n行 for(j=1;j<=n-i;j++)//打印n-i个空格 printf(" "); for(j=1;j<=2*i-1;j++)//打印2*i-1个*号 prin