一道关于兔子繁衍的编程题:

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

自己考虑了挺久,思路出现了问题,甚至连其中的规律都没有搞清楚.查看网上的一些算法之后,发现一个之前没有使用的思想:递归.目前对于递归的理解仅限于初级中的初级.

关于这道编程题,应该以这样的思路来进行考虑:

每个月的兔子的来源是哪些?答:上个月的兔子的个数(不管是否具备繁殖能力) + 2个月前的兔子的个数  在第1和2个月的时候,只有最开始的一对兔子.

这样想一想的话,就是用上个月的兔子个数 + 上上个月的兔子个数 ,就可以得到本月的兔子的个数.结果恰好是很著名的斐波那契数列.

     public static int method(int month){
if(month == 1 || month == 2){
return 1;
}else{
int num = method(month -1) + method(month -2);
return num;
}
}

思想就是结果= 上次程序的结果 + 上上次的程序的结果

后在网上查看有关递归的资料,看到另外两个用递归思想解决的问题:爬楼梯问题和汉诺塔问题

爬楼梯问题

假设一个楼梯有 N 阶台阶,人每次最多可以跨 M 阶,求总共的爬楼梯方案数。

分析:

台阶数(走法) 方法数
1 1 1
2 11 2 2
3 111 12 21 3
4 1111 112 121 211 225

因此可知,这个问题和之前的兔子繁衍问题是一个道理.

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

汉诺塔问题:

从左到右 A B C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱,大盘子只能在小盘子下面.

这些问题我想起来比较吃力,但网上解析很多,几乎涵盖了我的所有的考虑了,因此,我在这里只说以下较为简单快捷的一种理解方式.

A,B,C三个针,假设有n个盘子,只需要分成三步,①将(n-1)个盘子从A移动到B,②将最大的盘子从A放到C,③将(n-1)个盘子从B移动到C

f(n) = (f(n-1)*2) + 1;

public static int method(int n){
if(n == 1){
return 0;
}else if(n == 2){
return 1;
}else{
return method(n-1)*2 + 1;
}
}

再举个例子,使用递归的思想来打印9*9乘法表

正常若不使用迭代的话,可以这样来实现代码,使用两层嵌套的for循环

 public static void method_1(){
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= i;j++){
System.out.print(i + "*" + j + "=" + i*j + " ");
}
System.out.println();
}
}

若使用递归的话,问题就变成了:打印上一次的结果并打印新的一行

 public static void method_2(int i){
if (i == 1) {
System.out.println("1*1=1 ");
} else {
method_2(i - 1);
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + j * i + " ");
}
System.out.println();
}
}

关于递归的应用,大体上来说,就是需要发现并找到程序中的递归的情况,将问题简化.

初次接触java中的递归算法的更多相关文章

  1. 初次接触Java

    今天初次接触Eclipse,学着用他来建立java工程,话不多说,来看看今天的成果! 熟悉自己手中的开发工具,热热身 刚上手别慌,有问题找度娘 刚刚拿到这个软件的安装包我是一脸懵逼的,因为是从官网下载 ...

  2. 初次接触Java感受

    认真开始研究了idea后端开发环境 感触很深,突然觉得自己不能再一天的颓废下去,认真找点事情做一做,毕竟自己还是一张白纸,趁着自己年纪轻轻 经过一周的摸索自己努力了还不够,心里多么渴望自己身边的人能够 ...

  3. javaweb中的乱码问题(初次接触时写)

    javaweb中的乱码问题 在初次接触javaweb中就遇到了乱码问题,下面是我遇到这些问题的解决办法 1. 页面乱码(jsp) 1. 在页面最前方加上 <%@ page language=&q ...

  4. Java中static、this、super、final的用法

    一.          static 请先看下面这段程序: public class Hello{public static void main(String[] args){//(1)System. ...

  5. 【转】Java中static关键字用法总结

    1.     静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法. · 它 ...

  6. 【java_需阅读】Java中static关键字用法总结

    1.     静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法. · 它 ...

  7. java中static、this、super、final用途、用法及实例

    一.static 请先看下面这段程序: public class Hello { public static void main(String[] args){ //(1) System.out.pr ...

  8. Java中的static关键字的用法

    1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法. (2 ...

  9. Java中static关键字用法总结

      1.     静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法. · ...

随机推荐

  1. mysql5.5慢日志设置和查询

    mysql> showvariables like '%version%'; +-------------------------+---------------------+ | Variab ...

  2. Postgresql standby(备机只读)环境搭建

    下载PostgreSQL源码包,放在任意目录 设置/etc/sysctl.conf,增加以下内容 kernel.shmmni= 4096 kernel.sem =501000 6412800000 5 ...

  3. open in browser

    Sublime Text 3 Build 3065 Preferences-Key Bindings User: 直接key binding:{ "keys": ["al ...

  4. DNS没有生效的几个原因

    1.记录没有正确添加 请确认你的域名记录是否完全正确的添加.线路类型正确,记录类型正确 2.域名还没有生效 这个情况还会有另外一个现象,就是域名有时候可以ping,有时候不能ping. 这是因为你当地 ...

  5. spring mvc redirect设置FlashAttribute

    在Controller中设置: @RequestMapping("/redir") public String redir(Model model, RedirectAttribu ...

  6. php扩展SeasLog应用于 yii2 组件

    一.seaslog 简单介绍及使用原因 它是C 写的PHP扩展,性能很高,使用简单,能满足大部分简单的日志需求.(个人感觉) 其他优势请看-->https://github.com/Neeke/ ...

  7. XCode中设置字体大小

    XCode中设置字体大小 1)打开Preferences,快捷键是“Command + ,”(注意,是三个键,按住command键,然后再快速地按“+”和“,”两个键即可) 2)选择“Fonts &a ...

  8. BZOJ 1497: [NOI2006]最大获利(最大权闭合子图)

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MB Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机 ...

  9. 开源半成品的Web版工作流模板设计器(基于AngularJS 2和Redux), 还在继续填坑中

    先上个图: 很多企业内部的应用都需要有个工作流平台(插件),无奈灵活方便好用且能够自行更改代码定制嵌入的实在不多,只好自己动手慢慢搞. https://github.com/shibamo/99-fl ...

  10. java多线程安全问题 静态函数的修饰

    /* 如果同步函数被静态修饰后,使用的锁是什么呢? 通过验证,发现不在是this.因为静态方法中也不可以定义this. 静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象. 类名.c ...