汉诺塔

核心思想:分治 + 递归

分治的思想是化繁为简分而治之

整个过程,是将递归融合到分治中去。我们将汉诺塔许多铁块的移动,看作只有两块,最下面一块 D(down),和上面几块 U(up)。那么,整个问题,就只需要三步(三步体现了分治思想,这里同时也是递归的开始):

  1. 第一步:将 U 借助 C 从 A 移到 B;(在这里,首先借助递归函数来完成,借助 C 将 U 从 A 移动到 B的过程。U 可能也是一个多层铁块,因此依旧在使用分治的化繁为简的思想,将多块的 U 看作只有两块)【HanoiTower(n-1, a, c, b);】
  2. 第二步:将 D 从 A 移到 C;直接移动  【n, a, c;】
  3. 第三步:将 U 借助 A 从 B 移到 C。(在这里,再次使用递归,借助 A  将 U 从 B 移动到 C,递归内在使用分治思想)【HanoiTower(n-1, b, a, c);】

我们一起看一下代码,很简单:

public static void HanoiTower(int n, char a, char b,char c ) {
  if(n == 1) {
    System.out.println("第1个铁片 从"+a+"->"+c);
  } else {
    HanoiTower(n-1, a, c, b);   // 第一步
    System.out.println("第"+n+"个铁片 从"+a+"->"+c);   // 第二步
    HanoiTower(n-1, b, a, c);   // 第三步
  }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦田里的POLO桔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值