递归方法思想

2019-04-19  本文已影响0人  Kris_Ni
递归算法基础

在计算机编程应用中,递归算法对解决大多数问题都是十分有效的,主要是因为它能够使算法的描述变得简洁和易于理解,主要有3个特点。

使用递归算法时,应该注意以下4点:

例如:

public class stack {
    private static int index = 1;
    public static void main(String[] args) {
        try {
            test();
        } catch (StackOverflowError e) {
            System.out.println(index);
            e.printStackTrace();
        }
    }
    public static void test() {
        index++;
        test();
    }
}

通过递归不断地去调用自身,超过系统的栈的深度就会直接报错


接下来通过汉诺塔的例子具体讲解一下递归过程
首先什么是汉诺塔呢?
在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
okay,我们的目标是要把第一个柱子上的64片移到第三个柱子上面去

这样就形成了递归,在你调用move(n,a,b,c)的时候,只需要让n-1个片移到b上面去(move(n-1,a,c,b)),再把第n个片移到c,紧接着把b上面的n-1个片移到c上面去(move(n-1,b,a,c)),就可以完成整个操作。
从结果上面来看,需要搬移的次数为2^n - 1

public class HanoiTest {
    private static int count;
    public static void main(String[] args) {
        move(64,'a','b','c');
        System.out.println(count);
    }
    private static  void move(int n,int a,int b,int c) {
        if (n == 1) {
            count++;
            System.out.println((char)a +"-->"+ (char)c);
        } else {
            move(n-1,a,c,b);
            count++;
            System.out.println((char)a +"-->"+ (char)c);
            move(n-1,b,a,c);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读