汉诺塔问题(递归的本质,易懂)

经典递归之汉诺塔

递归的本质:将大的问题,分解为子问题,比如10!=10*9!,将10的阶乘变成了9的阶乘,这个就叫大问题分解为小问题


实现递归算法最重要的两步:1.大问题如何分解为小问题(大问题与小问题的关系),这个叫做递归的链条

2.小问题最后能否得到一个解决,这个叫做递归的基例,比如阶乘的例子:最后0的阶乘是1

所以在以上的基础上,再来理解汉诺塔
起始的柱子为A,中间的柱子为B,最终的柱子为C
大问题分解为小问题:
要将n个圆盘盘从A移动到C------>将n-1个圆盘从A移动到B,再将第n个圆盘从A移动到C,最后再将n-1个圆盘从B移动到C 
基例:
当n==1时,直接将其从起始的柱子,移动到最终的柱子


分析完成,以下为代码部分
#include<stdio.h>
int count = 0;//用于记录一共移动了多少次
void move(char start, char temp, char end,int num)
{
    if (num == 1)
    {
        count++;
        printf("%d:%c---->%c\n", num, start, end);
        return;
    }
    move(start, end, temp, num - 1);//大问题分解为小问题,将num-1个柱子从所在的位置移动到中转柱子上
    printf("%d:%c---->%c\n", num, start, end);
    count++;
    move(temp, start, end, num - 1);//大问题分解为小问题,将num-1个柱子从所在的位置移动到最终的柱子上
}
int main()
{
    int x;
    printf("请输入你想要的实现的汉诺塔的数量:");
    scanf("%d", &x);
    char start = 'A';
    char temp = 'B';
    char end = 'C';
    move(start, temp, end, x);
    printf("总共需要移动%d次", count);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值