递归解决汉诺塔问题

文章介绍了汉诺塔问题的起源和规则,以及解决该问题的递归算法。通过递归函数`Hanoi`,将n个圆盘从起始柱移动到目标柱,过程中遵循每次移动一个圆盘且大盘不能在小盘之下的规则。代码示例展示了如何使用C语言实现这一算法。
摘要由CSDN通过智能技术生成

汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:

  • 每次只能移动柱子最顶端的一个圆盘;

  • 每个柱子上,小圆盘永远要位于大圆盘之上;

汉诺塔问题中,3 个圆盘至少需要移动 7 次,移动 n 的圆盘至少需要操作 2n-1 次。

对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:

  1. 将起始柱上的 n-1 个圆盘移动到辅助柱上;

  1. 将起始柱上遗留的 1 个圆盘移动到目标柱上;

  1. 将辅助柱上的所有圆盘移动到目标柱上。

由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题。按照同样的思路,n-1 个圆盘的汉诺塔问题还可以继续简化,直至简化为移动 3 个甚至更少圆盘的汉诺塔问题。

void move(char pos1, char pos2)
{
    printf(" %c->%c ", pos1, pos2);
}

//n:代表盘子的个数
//pos1:起始位置,表示起始柱
//pos2:中转位置,表示辅助柱
//pos3:目的位置,表示目标柱

void Hanoi(int n, char pos1, char pos2, char pos3)
{
    if (n == 1)// 如果圆盘数量仅有 1 个,则直接从起始柱移动到目标柱
    {
        move(pos1, pos3);
    }
    else
    {
        //递归调用 hanoi 函数,将 n-1 个圆盘从起始柱移动到辅助柱上,整个过程的实现可以借助目标柱
        Hanoi(n - 1, pos1, pos3, pos2);
        
        // 将起始柱上剩余的最后一个大圆盘移动到目标柱上
        move(pos1, pos3);
        
       // 递归调用 hanoi 函数,将辅助柱上的 n-1 圆盘移动到目标柱上,整个过程的实现可以借助起始柱 
        Hanoi(n - 1, pos2, pos1, pos3);
    }
}
#include<stdio.h>
void move(char pos1, char pos2)
{
    printf(" %c->%c ", pos1, pos2);
}

//n:代表盘子的个数
//pos1:起始位置
//pos2:中转位置
//pos3:目的位置

void Hanoi(int n, char pos1, char pos2, char pos3)
{
    if (n == 1)
    {
        move(pos1, pos3);
    }
    else
    {
        Hanoi(n - 1, pos1, pos3, pos2);
        move(pos1, pos3);
        Hanoi(n - 1, pos2, pos1, pos3);
    }
}

int main()
{
    char pos1 = 'a';
    char pos2 = 'b';
    char pos3 = 'c';
    int n;
    scanf("%d", &n);
    Hanoi(n, pos1,pos2, pos3);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值