C语言(递归)汉诺塔简单实现代码20行

本文详细解析了汉诺塔问题的解决思路,通过递归算法将复杂问题分解为更小的子问题,并提供了C语言实现的源代码。以三个盘为例,展示了如何将上层视为整体进行移动,最终实现所有盘从初始位置移动到目标位置。

汉诺塔问题 —— 以三个盘为例

在这里插入图片描述
从小到大是称为1、2、3块。

将过程分为三个步骤:

  1. 将最上面两个为整体从X移动到Y
  2. 将第三个从X移动到Z
  3. 将前两个从Y移动到Z
    第二步只移动一个圆盘但第一步和第三步移动的是整个部分,所以将1和3步再次分解如下:
    第一步分解:将第一块从X移动到Z,再将第二块从X移动到Y,再将第一块从Z移动到Y,就实现了将前两块从X移动到Y。
    第三部分解:将第一块从Y移动到X,再将第二块从Y移动到Z,再将第一块从X移动到Z,就实现了将前两块从Y移动到Z。

推导:假设有20层,则将上面19层当作整体移动,再移动第20层,再移动上十九层,而每次移动19层又将前18层移动,逐步推导至第一层。

#include<stdio.h>
#include<stdlib.h>
void move(int n, char x, char y, char z)
{
    if (n == 1)
    {
        {printf("%c-->%c\n", x, z); }
    }
    else {
        move(n - 1, x, z, y);
        printf("%c-->%c\n", x, z);
        move(n - 1, y, x, z);
    }
}
int main()
{
    int n;
    printf("输入汉诺塔层数:");
    scanf("%d", &n);
    printf("步骤如下:\n");
    move(n, 'x', 'y', 'z');
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值