基础算法之三——递归法

Posted Clitter的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础算法之三——递归法相关的知识,希望对你有一定的参考价值。

基础算法之三——递归法“汉诺塔问题”

题目描述

古代有一座汉诺塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示。有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且在移动过程中,3个座上的盘子始终要保持大盘在下,小盘在上。在移动过程中可以利用B座来放盘子。要求输出移动的步骤。

输入数据

汉诺塔内的盘子个数n。(1<n<64)

输出要求

输出移动的步骤,每行一步,如从A座移动到C座,输出“A->C”。

输入样例

3

输出样例

A->C

A->B

C->B

A->C

B->A

B->C

A->C


心得

用递归的思路来分析,最重要的是把原问题分解成一个或多个形式相同、但规模小一些的问题。把A座中的n个盘子通过B座中移动到C座,可以分成三个步骤:

1、把n-1个盘子借助C座,移到B座

2、把第n个盘放到C座上

3、把n-1个盘子借助A座,移到C座

解题思路:java描述

import java.util.Scanner;

public class QHanoi {
    public static void Hanoi(int n, char src, char mid, char desc){
        //n等于1时直接从src座移动到desc座
        if(n == 1){
            System.out.println(src + "->" + desc);
            return;
        }
        //步骤1
        Hanoi(n-1, src, desc, mid);
        //步骤2
        System.out.println(src + "->" + desc);
        //步骤3
        Hanoi(n-1, mid, src, desc);
        return;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //接收整型输入
        int n = scanner.nextInt();
        if (n >= 1 && n <= 64) {
            //赋值,开始换盘子
            QHanoi.Hanoi(n, ‘A‘, ‘B‘, ‘C‘);
        }
        scanner.close();
    }
}

以上是关于基础算法之三——递归法的主要内容,如果未能解决你的问题,请参考以下文章

重温基础算法内部排序之归并排序法

Java基础入门五)之方法以及递归算法

算法学习笔记之三:八皇后问题(递归回溯)

用递归法计算斐波那契数列的第n项

leetcode算法题基础(四十二) 回溯算法总结

基础算法 分治法求最大最小元