`

递归算法求解一个古典的兔子问题

阅读更多

从今天起,开始研究java的相关算法,如果大家有什么好的算法题目的话,麻烦推荐一下,大家一起学习,一起研究,谢谢!如果有什么好的算法题目,我也会在解答后发表上来,有什么不足或者错误大家可以批评指正,或者提出自己的见解,谢谢!

 

下面是java经典算法里面的32题整理,按照自己的思维一步步来进行解析和说明,也希望给一些没有思路的朋友提供下思路,当然如果大家有什么好的思路的话也可以提出来。

 

【程序1 题目:古典问题:3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

分析:首先我们要明白题目的意思指的是每个月的兔子总数(这里应该是按对来计算的);我们假设将兔子分为小中大三种,兔子从出生后每三个月就生出一对兔子,那么我们假定第一个月为小兔子,第二个月为中兔子,第三个月之后就为老兔子(老兔子每过三个月还会再生的),那么第一个月分别有100,第二个月分别为010,第三个月分别为101,第四个月分别为,111,第五个月分别为212,第六个月分别为323,第七个月分别为535……

兔子总数分别为:11235813……

 

于是得出了一个规律,从第三个月起,后面的兔子总数都等于前面两个月的兔子总数之和。

 

于是有了下面的编程:

 

public class TestOne {

	public static void main(String[] args) {
		int rabbitNum = 1;
		for(int i = 1 ; i < 20 ; i++){
			rabbitNum = getMonthNum(i);
			System.out.println("兔子第   "+i+"  个月的总数为:"+rabbitNum);
		}
		
	}
	
	public static int getMonthNum(int x){
		int initRabbit = 1;
		
		if(x == 1 || x == 2){
			return initRabbit;
		}
		
		initRabbit = getMonthNum(x-1) + getMonthNum(x-2);
		
		return initRabbit;
	}
}

 

 

 

 

 

在这个例子中,主要用到了递归的思想。学过java的人一般都学过递归。递归函数提供了不一样的思维方式,用他来解决往往程序要短小很多,思维也会很清晰。它很适合解决树中的一些问题,在编译原理中也可以经常看到。

它的主要的解决问题的思维是这样的:

先解决最基础的简单的问题;

然后把复杂的问题归结为较简单的问题或把较大的问题分解为较小的问题。

下面这小段程序是用递归写的用来求1n所有这些正整数的和的:

public static int f(int n){
    if(n==1) return 1;
     return n+f(n-1);
}

 

 

 

 



第一句解决了最简单的问题,就是n==1的情况。接下去在求较复杂的fn)的时候把它归结为较简单的问题fn-1)。

用递归也有几个需要注意的问题:

1.程序总得要有机会让它退出来,不然会变成死循环。就象这里的第一句,而且一般来说位置也通常在第一句。

2.递归还有性能开销。一是因为函数调用时参数的入栈出栈操作。二是有些问题处理不当会出现重复计算(不是很老到的程序员经常会出这样的问题,导致性能有问题,然后说递归根本没实际意义)。

分享到:
评论

相关推荐

    java经典算法大全

    这个问题源自中世纪欧洲的一道趣题,描述了一对兔子每月繁殖的情况。假设每对兔子从出生后的第三个月开始每月生一对新的兔子,而所有兔子都不会死亡,那么每个月的兔子总数会形成一个特定的数列——斐波那契数列。...

    JAVA算法40 题练习

    这个问题可以使用递归方法来解决。 2. 素数判断:素数是指大于 1 的自然数,同时它的因子只有 1 和它本身。可以使用判断语句来确定一个数是否为素数。 3. 水仙花数:水仙花数是指一个三位数,其各位数字立方和等于...

    JAVA经典算法50题

    为了求解这个问题,我们可以使用递归或循环的方式。 **代码实现**(递归方式): ```java public class Fibonacci { public static void main(String[] args) { for (int i = 1; i ; i++) { System.out.println...

    java经典习题,经典题型!不容错过

    3. 古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?:这道题目考察了如何使用递归和数学公式来模拟生物增长。...

    C语言编程题

    这是一个中国古典数学难题,实际上是一个同余方程组问题,也被称为“孙子定理”或“中国剩余定理”。在编程中,可以通过枚举法寻找最小公倍数的倍数加上偏移量的方法来解决,即找到满足所有条件的最小正整数解。 ##...

    python、Object-c、c语言100练习题.pdf

    1. **古典问题:兔子繁殖** - 这是一个典型的斐波那契数列问题。斐波那契数列的规律是每个数等于前两个数的和,初始值为1,1。可以通过递归或循环实现,但递归可能会导致效率低下,循环更优。 2. **判断素数** - ...

    Java基础习题(20211003203515).pdf

    1. **数列计算**(古典问题:兔子问题): - 使用循环结构(如for或while)来模拟数列的增长。 - 数列的计算通常涉及到递归或动态规划。 2. **素数判断**: - 判断素数的方法是检查从2到该数平方根的所有数是否...

    (完整版)最新版c语言经典习题100例(最全面).doc

    古典的兔子繁殖问题,涉及到斐波那契数列,可以使用递归或动态规划方法求解。 这些习题覆盖了C语言的基础语法、数据类型、流程控制、函数、数组、字符串等多个核心知识点。通过解决这些习题,学习者能够逐步提升...

    100个经典例题(C语言).doc

    - **描述**:根据经典的兔子繁殖问题,使用循环或递归算法来计算每个月的兔子总数。 #### 【程序12】判断1010到200之间的素数 - **知识点**: - 素数判定 - 循环结构 - 条件判断 - **描述**:遍历指定范围内的...

    java基础练习题

    **题目描述**: 输入一个字符,判断它是否为小写字母,如果是,将它转换成大写字母,否则不转换。 **知识点**: 使用 `Character` 类中的 `isLowerCase` 和 `toUpperCase` 方法可以方便地实现这个功能。 ```java ...

Global site tag (gtag.js) - Google Analytics