递归实现汉诺塔

#include <stdio.h>

int Hanoi(int Number, char startColumn, char passColumn, char endColumn)
{
    if (Number == 1)
    {
        printf("从%c柱移动到%c柱子\n",startColumn,endColumn);
        return 0;
    }else{
        Hanoi(Number-1,startColumn,endColumn,passColumn);
        printf("从%c柱移动到%c柱子\n",startColumn,endColumn);
        Hanoi(Number-1,passColumn,startColumn,endColumn);
    }
    
}

void hanoiTest()
{
    printf("--------汉诺塔测试--------\n\n");
    printf("--------测试1--------\n");
    Hanoi(1,'A','B','C');
    printf("--------测试2--------\n");
    Hanoi(2,'A','B','C');
    printf("--------测试3--------\n");
    Hanoi(3,'A','B','C');
}

int main()
{
    hanoiTest();
}
 

 

三层汉诺塔的解答思路:第一轮先把x和y通过C柱都堆叠到B柱上

第二轮把z从A柱移动到C柱上 

 

第三轮把x和y通过A柱移动到C柱子上,完成汉诺塔的三层问题。
通过三层的汉诺塔问题,也可以解决n层的汉诺塔问题

如果在A柱上有n层,那么可以先把上面的n-1层当作一个整体x,而在上面n-1层的整体中,又可以将最下一格和上面的n-2格分为2个整体,通过递归的思想,先将问题层层”递“上去,最后变成了最上面的一层和最上面的第二层两个整体,于是第一层开始动,接着把”递“上去的问题再一层一层”归“下来,将上面n-1层通过C柱,转移到B柱,即完成了汉诺塔问题的第一轮,于是A柱中的第n层可以移动到C柱子,即完成了汉诺塔问题的第二轮,最后则是把原本上面的n-1层通过A柱转移到C柱,完成汉诺塔问题的第三轮
 

  • n = 1 时,
    •  直接把盘子从 A 移到 C;
  • n > 1 时,
    •  先把上面 n - 1 个盘子从 A 移到 B(子问题,递归);
    •  再将最大的盘子从 A 移到 C;
    •  再将 B 上 n - 1 个盘子从 B 移到 C(子问题,递归)。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值