讨论/题目交流/一道简单的汉诺塔题目,为什么这种写法就是错的呢?/
一道简单的汉诺塔题目,为什么这种写法就是错的呢?

题目链接:https://leetcode-cn.com/problems/hanota-lcci/
以下为java代码,鉴于是一道简单的汉诺塔题,大家那么厉害,代码就不用解释太多了吧~:

class Solution {
        public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
            if (A.size() == 0) return;
            if (A.size() == 1) {
                C.add(A.remove(0));
                return;
            }
            //获取该柱子最下面那个盘
            int n = A.remove(0);

            //把A柱子剩余盘从A柱子移动到B柱子,已C柱子作为中转(辅助)柱子
            hanota(A, C, B);

            //把那个原来A柱子最下面的盘放到C柱子中
            C.add(n);

            //把B柱子的盘从B柱子移动到C柱子,已A柱子作为中转(辅助)柱子
            hanota(B, A, C);
        }
    }

错误信息如下:显示了栈溢出

错误.PNG

展开讨论
共 1 个讨论

不是,还是需要你解释一下代码。
看了一下就感觉那个remove的位置很奇怪,你先把底部的拿掉,然后在中间放回来
我大概明白你的意思,你想表达先不看最底下那个,把A剩下所有的放到B里,然后把底放到C,接着把B全放入C。
但你这样是不行的,不能用remove拿掉,或者拿掉不能这么早放回来(直接放这题就没意义了,所以还是不建议提前remove),因为它可能"被"参与中间移动。
你拿[3, 2, 1, 0]去一步步跟踪,在3被add回来后有一栏出现了[3, 0]接下来是把0移动,但你的代码同时把3也参与移动了,从而陷入了死循环

1