think in java 书中使用递归分析

代码如下:

public class Snake implements Cloneable {
private Snake next;
private char c;
// Value of i == number of segments
Snake(int i, char x) {
c = x;
if(--i > 0)
next = new Snake(i, (char)(x + 1));
}
void increment() {
c++;
if(next != null)
next.increment();
}
public String toString() {
String s = ":" + c;
if(next != null)
s += next.toString();
return s;
}
public Object clone() {
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {}
return o;
}
public static void main(String[] args) {
Snake s = new Snake(5, 'a');
System.out.println("s = " + s);
Snake s2 = (Snake)s.clone();
System.out.println("s2 = " + s2);
s.increment();
System.out.println(
"after s.increment, s2 = " + s2);
}
}

示意图如下:

输出如下:

s = :a:b:c:d:e
s2 = :a:b:c:d:e
after s.increment, s2 = :a:c:d:e:f

分析:

  • 在讲clone()的时候,为说明浅复制,举例此类;

一条 Snake(蛇)由数段构成,每一段的类型都是 Snake。所以,这是一个一段段链接起来的列表。

所有段都是以循环方式创建的,每做好一段,都会使第一个构建器参数的值递减,直至最终为零。

而为给每段赋予一个独一无二的标记,第二个参数(一个 Char )的值在每次循环构建器调用时都会递增。

increment()方法的作用是循环递增每个标记,使我们能看到发生的变化;

而 toString 则循环打印出每个标记。

使用递归打印阶乘

@Test
public void test() {
//10! = 10 * 9 * 8 * 。。。。1;
System.out.println(get(36));
}
public static long get(int n) {
long result = 1;
if (n == 1) {
result *= 1;
}
else {
result = n * get(n-1);
}
return result;
}

使用递归打印斐波那契数列

    //第一和第二项是1,后面每一项是前二项之和,即1,1,2,3,5,8,13,...。
//递归实现:
public static int fun02(int n) {//n是第n个数,从 0 开始
if (n > 1) {
return (fun02(n-1) + fun02(n-2));
}else {
return 1;
}
}
public static void main(String[] args) {
for (int i = 0; i <= 9; i++) {
System.out.println(fun02(i));
}
}

使用递归打印 9 * 9乘法口诀表

public class multiplication99 {

    @Test
public void test(){
//getByFor(9);
getByRecursion(9);
} public static void getByFor(int n) {//for 循环实现
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i+" * "+j+" = "+i*j+" ");
}
System.out.println();
}
} public static void getByRecursion(int n) {//递归 实现
if (n == 1) {
System.out.println("1 * 1 = 1 ");
}
else {
getByRecursion(n-1);
for (int j = 1; j <= n; j++) {
System.out.print(n+" * "+j+" = "+n*j+" ");
}
System.out.println();
}
}
}

java代码实现递归的更多相关文章

  1. 数据结构笔记--二叉查找树概述以及java代码实现

    一些概念: 二叉查找树的重要性质:对于树中的每一个节点X,它的左子树任一节点的值均小于X,右子树上任意节点的值均大于X. 二叉查找树是java的TreeSet和TreeMap类实现的基础. 由于树的递 ...

  2. 希尔排序及希尔排序java代码

    原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...

  3. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  4. 四种java代码静态检查工具

    [转载]常用 Java 静态代码分析工具的分析与比较 转载自 开源中国社区 http://www.oschina.net/question/129540_23043       1月16日厦门 OSC ...

  5. 常见的排序算法之Java代码解释

    一 简要介绍 一般排序均值的是将一个已经无序的序列数据重新排列成有序的 常见的排序分为: 1 插入类排序 主要就是对于一个已经有序的序列中,插入一个新的记录.它包括:直接插入排序,折半插入排序和希尔排 ...

  6. Java中的递归原理分析

    解释:程序调用自身的编程技巧叫做递归.        程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用 ...

  7. Java实现非递归删除目录

    最近在学C#的文件系统, 发现C#的文件系统貌似比java的东西少一点, 居然连删除目录都直接做好封装了, 想到学java的时候还要自己写递归删除, 好像没写过非递归的,就在网上查了下, 关于非递归删 ...

  8. 原生Java代码拷贝目录

    拷贝.移动文件(夹),有三方包commons-io可以用,但是有时候有自己的需求,只能使用原生java代码,这时可以用以下几种方式进行拷贝: 1.使用系统命令(Linux)调用 此种方式对操作系统有要 ...

  9. java 代码

    java 里的 pandas tablesaw DataFrame 再有就是 spark 了 java 代码规范 Java8特性详解 lambda表达式 Stream Sonar 规则检测 sprin ...

随机推荐

  1. 二进制x&(x-1);

    求下面函数的返回值(微软) int func(x) {     int countx = 0;     while(x)     {           countx ++;           x ...

  2. PAT 1121 Damn Single[简单]

    1121 Damn Single (25 分) "Damn Single (单身狗)" is the Chinese nickname for someone who is bei ...

  3. 使用js在网页上显示时间

    <html> <script> function getDate(){ var d,s,t; d = new Date(); s = d.getFullYear().toStr ...

  4. matplotlib绘制散点图

    参考自Matplotlib Python 画图教程 (莫烦Python)(10)_演讲•公开课_科技_bilibili_哔哩哔哩 https://www.bilibili.com/video/av16 ...

  5. docker——安装

    Docker划分为CE和EE.CE即社区版(免费,支持后期三个月),EE即企业版,强调安全,付费使用. #安装依赖包 yum install -y yum-utils device-mapper-pe ...

  6. ionic 打包

    比如我下载一个官方的小Demoionic start myApp tabs(我默认你已经配置好了安卓的开发环境.安装了全局的ionic.cordova)   首先,你需要给项目添加安卓平台的支持ion ...

  7. NC开发笔记指导

    修改端口 InvocationInfoProxy.getInstance().get().getUserCode(); 前台 Nchome F:\JAVA\Projects\ERPEHROA\ufid ...

  8. 【Linux学习】3.Linux常见配置文件

    一./etc 配置文件/etc/passwd 用户数据库,其中的域给出了用户名.真实姓名.家目录.加密口令和用户的其他信息 /etc/group 类似/etc/passwd ,但说明的不是用户而是组. ...

  9. 20145316《Java程序设计》第二周学习总结

    20145316<Java程序设计>第2周学习总结 教材学习内容总结 3.1.1 Java的类型 分为基本类型(Primitive type)和类类型(Class type) 基本类型: ...

  10. mysql中sql语句中常见的group_concat()函数意思以及用法,oracle中与其一样的功能函数是wmsys.wm_concat()

    1.group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一 ...