初次接触java中的递归算法

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

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

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

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

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

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

1     public static int method(int month){
2         if(month == 1 || month == 2){
3             return 1;
4         }else{
5             int num =  method(month -1) + method(month -2);
6             return num;
7         }
8     }

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

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

爬楼梯问题

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

分析:

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

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

 1 public static int f(int n) {
 2         if (n == 0) {
 3             return 0;
 4         } else if (n == 1) {
 5             return 1;
 6         } else if (n == 2) {
 7             return 2;
 8         } else {
 9
10             return f(n - 1) + f(n - 2);
11         }
12     }

汉诺塔问题:

从左到右 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循环

1 public static void method_1(){
2         for(int i = 1;i <= 9;i++){
3             for(int j = 1;j <= i;j++){
4                 System.out.print(i + "*" + j + "=" + i*j + " ");
5             }
6             System.out.println();
7         }
8     }

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

 1 public static void method_2(int i){
 2          if (i == 1) {
 3              System.out.println("1*1=1 ");
 4          } else {
 5              method_2(i - 1);
 6              for (int j = 1; j <= i; j++) {
 7                  System.out.print(j + "*" + i + "=" + j * i + " ");
 8              }
 9              System.out.println();
10          }
11     }  

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

时间: 2024-12-19 19:17:50

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

第一章 初次接触Java

P9——习题 1. Java语言的特点 (1)简单而高效 (2)面向对象的语言 (3)平台无关性与可移植性 (4)稳定性与安全性 (5)多线程且是动态的 (6)高性能 (7)分布式,“物理上分布,逻辑上统一” 3.Java平台分三类 (1)J2EE(Java2 Enterprise Edition)适用于企业,为企业计算提供应用服务运行和开发平台. (2)J2SE(Java2 Standard Edition)适用于学习,为台式机和工作站提供开发和运行平台. (3)J2ME(Java2 Micr

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

javaweb中的乱码问题 在初次接触javaweb中就遇到了乱码问题,下面是我遇到这些问题的解决办法 1. 页面乱码(jsp) 1. 在页面最前方加上 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2. 读取数据时乱码 (servlet) 1. 在request.getParameter("nam

Java中static关键字用法总结

1.     静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法. · 它们只能访问static数据. · 它们不能以任何方式引用this 或super. class Simple { static void go() { System.out.println("Welcome"); } } public class Cal { public static vo

java 中的static 的那些事...

1.     静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法. · 它们只能访问static数据. · 它们不能以任何方式引用this 或super. class Simple { static void go() { System.out.println("Welcome"); } } public class Cal { public static vo

c++中类的初次接触

下面是我写的简单的代码,初次接触c++中的类,c++真的是博大精深啊,学习c++的路还很长,加油! 1 /*q1.cpp*/ 2 //一个简单的类极其实例化 3 #include<iostream> 4 using namespace std; 5 6 class Point{ 7 public: 8 //设置坐标 9 void setPoint(int x,int y){ 10 xPos = x; 11 yPos = y; 12 } 13 //打印坐标 14 void printPoint(

java中的数组概念

数组的定义形式: 动态初始化方式: 1.声明并开辟数组 String str[]=new String[3];//3表示数组的长度 2.分布完成 String str[]=null; str=new String[3]; 静态初始化 1.简化格式 String str [] = {"1","2","3"}; 2.完整格式 String str = new String[]{"1","2","3&q

[转]Java中常用的集合—初学者的你不可错过的精编整理

集合一直都是项目中非常常见的,我是一个Android开发者,集合对于我来说,在项目中使用的次数非常之多,因为使用的多,熟能生巧,所以这里呢!就给那些初学者整理一下Java当中常用的集合吧!   因为此篇文章是给初学者看到,所以对于集合的认识,我们就不从内存的角度去分析了,等你Java学到一定的时候,再去学习一下集合的底层实现,这会让成为一名更加牛的Java程序员.   在整理之前呢,我们先聊一聊为什么集合会这么常用?,集合这个概念,我们初次接触是在高中的数学当中,高中的集合具有以下知识点:  1

java中BigDecimal的学习

干着java的活,但是看的都是一些偏底层的东西(或者我根本就没有看),有点荒废了java的学习. 最近一直在用到一个类是BigDecimal,但都是模棱两可地在那儿用,并没有深入研究这个类的细节,感觉不能再拖了. BigDecimal,从名字来看就是进行大数运算的,不光这样,还广泛用于小数的精确运算. 当你接触到和钱有关的计算的时候,这个类还是很有用滴. 先来看一个例子 1 package com.tuhooo.bigdecimal; 2 3 /** 4 * Created by tuhooo

Java中的字符串常量池

最近做到一个题目: 问题:String str = new String("abc"),"abc"在内存中是怎么分配的?    答案是:堆,字符串常量区. 题目考查的为Java中的字符串常量池和JVM运行时数据区的相关概念."abc"为字面量对象,其存储在堆内存中.而字符串常量池则存储的是字符串对象的一个引用. Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid&qu