java代码实现递归

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);
    }
}

示意图如下:

snake.png

输出如下:

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();
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,403评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,931评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,386评论 25 709
  • 今天八点半起床,十点多出门去找工作,去了武汉天地和花园道柏沃男装高订去应聘,结果没有应聘上。虽然没有应聘上但是去应...
    YaoYiLin阅读 1,579评论 3 3
  • 与实力电商大佬角力竞逐,苏宁选择了在凸显的优势中开发平台模式,并在自身不可忽视的劣势中思忖发展。 文│本刊记者钱玉...
    KSZxMX阅读 2,924评论 0 1