前言
快来看看汉诺塔问题如何解决吧
力扣题目链接
思路
- A借C放B
- A放C
- B借A放C
子问题
N个盘子从A柱借B柱放到C柱
函数头
void dfs (a , b , c , n)
函数体
-
dfs(a,c,b,n-1) //N-1个盘子从A柱借C柱放到B柱
-
c.add(a.remove) // A柱的盘子放到C
-
dfs(b,a,c,b,n-1) //N-1盘子从B柱借A柱放到C柱
递归出口
if (n==1)
c.add(a.remove)
代码编写
class Solution {
public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
DFS(A,B,C,A.size());
}
public void DFS(List<Integer> A, List<Integer> B, List<Integer> C,int N) {
if(N==1){
C.add(A.remove(A.size()-1));
return;
}
DFS(A,C,B,N-1);
C.add(A.remove(A.size()-1));
DFS(B,A,C,N-1);
}
}
总结
汉诺塔问题核心思路:N个盘子从A柱借B柱移到C柱
写递归代码的关键是找出子问题,并思考如何利用子问题解决总问题
文章到这结束啦,感谢阅读~
如果你觉得文章写的还不错,记得点赞收藏评论三连~ ❤