0
点赞
收藏
分享

微信扫一扫

【集合专题】—— 深入理解汉诺塔的递归算法

hwwjian 2022-04-15 阅读 56

一、对于集合的基础认识

1.List 是一个集合的接口。允许存在重复的元素,主要有两种实现类。
ArrayList 与 LinkedList
2.一些常用的方法:

List<Integer> list = new ArrayList<>;
//向集合中添加元素
list.add(element);
//获取元素
list.get(index);
//获取集合的长度
list.size();
//删除集合的元素
list.remove(index);
//清空集合中的元素
list.clear();
//判断集合是否为空
list.isEmpty();
二、LeetCode 面试题 08.06. 汉诺塔问题

在这里插入图片描述
核心思想:
(1)汉诺塔问题是一个经典的递归问题,属于分治算法的一种。

(2)将n个盘子从某个柱子上移动到指定的柱子上,将其变为将n-1个盘子移动到辅助的柱子上,把最后一个盘子直接移动到目标柱上。

(3)此时问题的规模就缩小到了这 n-1 个盘子移动到目标数上。

(4)问题的规模为: H(n) = H(n - 1) + 1 + H(n - 1)

代码部分:

class Solution {
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        //获取源柱上盘子的个数[对于获取集合中元素的个数通过size方法来完成]
        int n = A.size();

        //调用移动盘子的方法
        move(n, A, B, C);
    }

    public void move(int n, List<Integer> A, List<Integer> B, List<Integer> C){
        if(n == 0){
            return;
        }
        //将n-1个盘子移动到辅助柱上
        move(n-1, A, C, B);
        C.add(0, A.remove(0));
		//再将n-1个盘子移动到目标柱上
        move(n-1, B, A, C);
    }
}

对于代码的执行流程与内存机制分析:

(1)对于递归调用一次,就会生成一个方法栈。

(2)当递归结束后,会返回并销毁方法栈。在返回时会执行整个方法。

(3)具体的执行流程:

假设有3个盘子,有A、B、C三个柱子

(1)在第一次调用move()方法时,对其中两个盘子进行递归处理
move(2, a, c, b)
第二次调用move()方法时,再对一个盘子进行处理
move(1, a, b, c)
第三次调用move()方法时,再次进入递归调用
move(0, a, c, b)
此时 n == 0, 递归调用结束。

(2)函数返回,继续执行下面的代码

举报

相关推荐

0 条评论