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

有一对兔子,从出生后第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. HDU-1701-ACMer

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1701 解题: 好久没做题,好久没写解题思路了,连简答题都不会做了,下午的月赛挂了,我悲剧了,在此发牢骚 ...

  2. RAC 开启gsd和oc4j服务

    Oracle 11g RAC中,发现oc4j以及gsd服务都处于offline状态,这是Oracle 11g RAC默认情形.即便如此,并不影响数据库的使用,因为 oc4j 是用于WLM 的一个资源, ...

  3. VMware虚拟机出现Reason: Failed to lock the file

    打开VMware出现Cannot open the disk *.vmdk or one of the snapshot disks it depends on.Reason: Failed to l ...

  4. StackView的功能和用法

    StackView也是AdapterViewAnimator的子类,它也用于显示Adapter提供的系列View.SackView将会以“堆叠(Stack)”方式来显示多个列表项. 为了控制Stack ...

  5. easelJS 初始入门

    easelJS 初始入门 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  6. 报错找不到jquery-1.10.2.min.map解决办法

    http://fruithardcandy.iteye.com/blog/1941452

  7. 如何使用矩阵乘法加速动态规划——以[SDOI2009]HH去散步为例

    对这个题目的最初理解 开始看到这个题,觉得很水,直接写了一个最简单地动态规划,就是定义 f[i][j]为到了i节点路径长度为j的路径总数, 转移的话使用Floyd算法的思想去转移,借助这个题目也理解了 ...

  8. 从零开始学习C#——HelloWorld(一)

    从零开始学习C# 老规矩Hello World 您的第一个程序 visual studio 如何使用就不说了 //编程的开始,Hello World! program in C# using Syst ...

  9. .Net基础体系和跨框架开发普及

    .net体系经过十几年发展,发生了很多变化.特别是在最近两年,随着开源和跨平台的发展,衍生出很多概念,像标准库,可移植库,.Net Core等,相信有不少同学对他们之间的关系是有一些困惑的,这里我从基 ...

  10. 设置tableView的分割线填满cell的方式总结

    方式一:cell的底部添加一个UIView 1.在tableViewController的viewDidLoad中取消系统的分割线 // 取消系统的分割线 self.tableView.separat ...