汉诺塔问题【递归】

有三根针ABCA针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。

749db0e30f19427bb63bc4f1023318de.png

递归过程分解

  1. 基本情况

    • 当只剩下一个盘子时,直接将其从源针移动到目标针。这是递归的终止条件。
  2. 递归情况

    • 将 N 个盘子从源针移动到目标针,借助辅助针:
      • 步骤 1:先将上面的 N−1个盘子从源针移动到辅助针。这可以看作是一个子问题,问题规模从 N 变为 N−1
      • 步骤 2:将最大的盘子(第 N 个盘子)从源针移动到目标针。
      • 步骤 3:最后,将之前在辅助针上的 N−1 个盘子移动到目标针。再次,这也是一个子问题
#include <iostream>
using namespace std;

// 把 src 针的最上面一个盘子移动到 dest 针上
void move(char src, char dest) { 
    cout << src << " --> " << dest << endl; // 输出移动的过程
}

// 把 n 个盘子从 src 针移动到 dest 针,以 medium 针作为中介
void hanoi(int n, char src, char medium, char dest) 
{
    // 基础情况:如果只有一个盘子,直接移动
    if (n == 1) 
    {
        move(src, dest); // 移动盘子从 src 到 dest
    } else 
    {
        // 递归
        // 1. 将 n-1 个盘子从 src 移动到 medium,借助 dest
        hanoi(n - 1, src, dest, medium);
        
        // 2. 将第 n 个盘子(最大的盘子)从 src 移动到 dest
        move(src, dest);
        
        // 3. 将 n-1 个盘子从 medium 移动到 dest,借助 src
        hanoi(n - 1, medium, src, dest);
    }
}


int main() {
    int N; // 盘子的数量
    cout << "Enter the number of disks: ";
    cin >> N; // 输入盘子的数量
    hanoi(N, 'A', 'B', 'C'); // 从 A 针移动到 C 针,借助 B 针
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值