汉诺塔问题

给定三根柱子,记为 A、B 和 C 。起始状态下,柱子 A 上套着 𝑛 个圆盘,它们从上到下按照从小到大的 顺序排列。我们的任务是要把这 𝑛 个圆盘移到柱子 C 上,并保持它们的原有顺序不变。在移动圆盘的过程中,需要遵守以下规则。

  1. 每次只能移动一个圆盘。
  2. 小圆盘必须时刻位于大圆盘之上。

1个圆盘

解:1个圆盘时,直接将圆盘从A移动到C。

2个圆盘

解:2各圆盘时问题也比较简单。我们可以先将小圆盘从A移动到B,将大圆盘从A移动到C,再将小圆盘从B移动至C。

3个圆盘

将3个移动圆盘的问题拆分为,

  1. 先移动2个圆盘
  2. 再移动一个圆盘
  3. 最后移动两个圆盘

即3个圆盘的问题拆解后就转换为2次移动2个圆盘,1次移动一个圆盘的问题。以此类推,n个圆盘的问题就可以转话为,2次移动n-1个圆盘,1次移动一个圆盘的问题。

n个圆盘

扩展:

n个圆盘 最少需要移动几次?

由于f(n)=2f(n-1)+1,则有

f(1)=1;

f(2)=3;

f(3)=7;

f(4)=15;

int moveTimes(int n){
    if(n==1){
        return 1;
    }
    return 2*moveTimes(n-1)+1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值