递归(斐波那契数列,汉诺塔)

在一个方法(函数)的内部调用该方法(函数)本身的编程方式.

package demo3;

public class TestRecursive {
    public static void main(String[] args) {
        print(3);
    }

    private static void print(int i) {
        if (i > 0) {
            System.out.println(i);
            print(i - 1);
        }

    }
}

斐波那契数列

//1-1-2-3-5-8-13-21-34-55-89-144-233-377-610-987-1597-2584-4181-6765

package demo3;

/**
 * 
 * @author ThinkPad 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda
 *         Fibonacci)
 *         以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契
 *         数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈
 *         N*)在现代物理、准晶 体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963
 *         年起出版了以《斐波纳契数列季刊》为名的一份数学杂 志,用于专门刊载这方面的研究成果。
 */
public class TestFibonacci {
    public static void main(String[] args) {
        for (int i = 1; i < 21; i++) {
            System.out.print(fibonacci(i)+"-");
        }
    }

    private static int fibonacci(int i) {
        if (i == 1 || i == 2) {
            return 1;
        } else {
            return fibonacci(i - 1) + fibonacci(i-2);
        }
    }

//    public static void main(String[] args) {
//        int i=1;
//        int j=1;
//        int t=0;
//        while (i<100){
//            t=i;
//            i=j;
//            j=i+t;
//            System.out.print(t+"-");
//        }
//        
//    }

//    public static void main(String[] args) {
//        int i=1;
//        int j=1;
//        int temp;
//        System.out.print(i+"-"+j+"-");
//        for (int k = 0; k < 10; k++) {
//            temp=i;
//            i=j;
//            j=temp+j;
//            System.out.print(j+"-");
//        }
//    }
}

汉诺塔问题

http://www.4399.com/flash/109504_1.htm

https://baike.baidu.com/item/%E6%B1%89%E8%AF%BA%E5%A1%94/3468295?fr=aladdin

https://ke.qq.com/webcourse/index.html#cid=342067&term_id=100406491&taid=2656806640105523&vid=5285890787888818713

package demo3;

public class TestHanoi {

    private static int i = 0;

    public static void main(String[] args) {
//        for (int j = 1; j < 4; j++) {
        int j = 5;
        i = 0;
        hanoi(j, 'A', 'B', 'C');
        System.out.println("---" + j + "个盘子至少需要" + i + "步-------");
//        }

    }

    /**
     * 
     * param j 第几个盘子
     * 
     * @param from 开始位置
     * @param in   中间位置
     * @param to   目标位置 无论有多少个盘子我们都认为上面的所有盘子是一个,最下面的是一个
     */
    private static void hanoi(int j, char from, char in, char to) {
        if (j == 1) {
            i++;
            System.out.println(i + ":把第" + j + "个盘子从" + from + "移动到" + to + "盘子");
        } else {
            // 移动上面所有盘子到中间
            hanoi(j - 1, from, to, in);
            // 把最下边的盘子挪到最后
            i++;
            System.out.println(i + ":把第" + j + "个盘子从" + from + "移动到" + to + "盘子");

            // 把中间的盘子挪到最后
            hanoi(j - 1, in, from, to);
        }
    }
}

 

posted @ 2020-04-07 16:28  已老  阅读(446)  评论(0)    收藏  举报