c语言汉诺塔递归算法

c语言汉诺塔递归算法详解

汉诺塔简介
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘
由3盘引入
以下是3盘的图形操作
在这里插入图片描述A—>C
在这里插入图片描述
A—>B
在这里插入图片描述
C—>B:分界点,将 n-1个盘子先放到B座位上
在这里插入图片描述

A—>C:将A座上地剩下的一个盘移动到C盘上
在这里插入图片描述
B—>A
在这里插入图片描述
B—>C
在这里插入图片描述
A—>C将n-1个盘从B座移动到C座上
在这里插入图片描述
GIF图形展示
在这里插入图片描述
总体思想
1.将 n-1个盘子先放到B座位上
2.将A座上地剩下的一个盘移动到C盘上
3.将n-1个盘从B座移动到C座上
或者
在1盘的基础上操作2盘,在2盘的基础上操作3盘………在n-1盘的基础上操作n盘
总体代码

void move(char x, char y);
void hannuo(int n,char one ,char two,char three) //将n个盘从one座借助two转移到three
{ 
    if(n==1){
        move(one, three);
    }
    else
    {
        hannuo(n-1,one ,three,two);//将 n-1个盘子从A借助c放到B座位上
        move(one,three);//将A座上地剩下的一个盘移动到C盘上
        hannuo(n-1,two,one,three);//将n-1个盘借助A从B座移动到C座上
    }
}
void move(char x,char y)
{
    printf("%c--->%c\n",x,y);
}

void main()
{
    int n;
    printf("input your number");
    scanf("%d",&n);
    hannuo(n,'A','B','C');
}

代码运行拆分展示

输入4
hannuo(4,'A','B','C');
void hannuo(4,A,B,C)//将4个盘从A借助B转移到C
{
    hannuo(3,A,C,B);//将3个盘子从A借助C放到B
    void hannuo(3,A,C,B)
    {
        hannuo(2,A,B,C);//将2个盘子从A借助B放到C
        void hannuo(2,A,B,C)
        {
            hannuo(1,A,C,B);//将1个盘子从A借助C放到B座位上
            void hannuo(1,A,C,B)
            {
                move(A,B);
            }
            move(A,C);
            hannuo(1,B,A,C);//将1个盘借助B从A座移动到C座上
            void hannuo(1,B,A,C)
            {
                move(B, C);
            }
        }
        move(A,B);
        hannuo(2,C,A,B);//将2个盘借助C从A座移动到B座上
        void hannuo(2,C,A,B)
        {
            hannuo(1,C,B,A);//将1个盘子从C借助B放到A座位上
            void hannuo(1,C,B,A)
            {
                move(C,A);
            }
            move(C,B);
            hannuo(1,A,C,B);//将1个盘借助A从C移动到B
            void hannuo(1,A,C,B)
            {
                move(A, B);
            }
        }
    }
    move(A,C);
    hannuo(3,B,A,C);//将3个盘借助B从A移动到C上
    void hannuo(3,B,A,C)
    {
        hannuo(2,B,C,A);//将2个盘子从B借助C放到A座位上
        void hannuo(2,B,C,A)
        {
            hannuo(1,B,A,C);//将1个盘子从B借助A放到C座位上
            void hannuo(1,B,A,C)
            {
                move(B, C);
            }
            move(B,A);
            hannuo(1,B,A,C);//将1个盘借助B从A座移动到C座上
            void hannuo(1,C,B,A)
            {
                move(C, A);
            }
        }
        move(B,C);
        hannuo(2,A,B,C);//将2个盘借助A从B座移动到C座上
        void hannuo(2,A,B,C)
        {
            hannuo(1,A,C,B);//将1个盘子从A借助C放到B座位上
            void hannuo(1,A,C,B)
            {
                move(A, B);
            }
            move(A,C);
            hannuo(1,B,A,C);//将1个盘借助B从A座移动到C座上
            void hannuo(1,B,A,C)
            {
                move(B, C);
            }
        }
    }
}

代码运行结果
A—>B
A—>C
B—>C
A—>B
C—>A
C—>B
A—>B
A—>C
B—>C
B—>A
C—>A
B—>C
A—>B
A—>C
B—>C
在这里插入图片描述

步骤分解
代码的每3部分就相当于执行了一次总体思想3步骤
列如:
这3步骤目的:将A上2个盘子(共4个)从A借助B放到C,此时B空
A—>B
A—>C
B—>C

A—>B

这3步骤目的:将之前移动在C上2个盘(共2个)从C借助 A移动到B上,此时C空
C—>A
C—>B
A—>B
之上的3大步骤(7小步骤)就是为了将A上的3个盘子(共4个)从A借助C放到B,此时C空

A—>C

之下的3大步骤(7小步骤)就是为了将B上的3个盘子(共3个)从B借助A放到C,此时A空

这3步骤目的:将B上2个盘子(共3个)从B借助C放到A座位上,此时都不空
B—>C
B—>A
C—>A

B—>C,此时B空

这3步骤目的:将A上2个盘(共两个)从A借助B移动到C上
A—>B
A—>C
B—>C
小总结
向这种3大步骤里套3小步骤,3小步骤里还套3小小步骤的算法就可利用递归解决问题

4盘图形运行步骤
1.A—>B
将3个盘子从A借助C放到B开始(共7步骤)
在这里插入图片描述
2.A—>C
在这里插入图片描述
3.B—>C
在这里插入图片描述
这之前相当于有两盘的时候怎么移动
4.A—>B
在这里插入图片描述
5.C—>A
在这里插入图片描述
6.C—>B
在这里插入图片描述
7.A—>B
在这里插入图片描述
将3个盘子从A借助C放到B结束
8.A—>C
将A座上地剩下的一个盘移动到C盘上开始
在这里插入图片描述
将A座上地剩下的一个盘移动到C盘上结束
9.B—>C
将3个盘从B座移动到C座上开始
在这里插入图片描述
10.B—>A
在这里插入图片描述
11.C—>A
在这里插入图片描述
两盘移动
12.B—>C
在这里插入图片描述
13.A—>B
在这里插入图片描述
14.A—>C
在这里插入图片描述
15.B—>C 将3个盘从B座移动到C座上结束
在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z_W_H_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值