汉诺塔c语言实现及分析

目录

起源

c语言实现


起源

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

一次只移动一片,不管在哪根针上,小片必须在大片上面。

c语言实现

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

static int count = 0;//计数器

void move(int n,char A,char C)

{

       printf("将%d号盘子从%c移动到%c\n", n, A, C);

       count++;

}

void hannio(int n, char A, char B, char C)

{

       int count = 0;

       int i = 0;

       if (n == 1)

       {

               move(n,A,C);

               printf("将%d号盘子从%c移动到%c\n", n,A,C);

       }

       else

       {

               hannio(n - 1,A,C,B);//借助C将n-1个从A移到B

               move(n, A, C);//将最大那个从A移到C

               hannio(n - 1, B, A, C);//借助A将n-1个从B移到C

       }

}

int main()

{

       char ch1 = 'A';

       char ch2 = 'B';

       char ch3 = 'C';

       int n = 0;

       scanf("%d", &n);

       hannio(n,'A','B','C');

       printf("总共移动%d次\n", count);

       return 0;

}




//代码分析:

//n = 3为例

//n = 3不满足n = 1条件, 进入else

//hannio(3, A, B, C) A - A B - B C - C

//     hannio(2, A, C, B) A - A B - C, C - B 此时B里面是C, C里面是B

//             hannio(1, A, C, B)  A - A B - B C - C

//                    printf 将1号从A移动到C n = 1 执行if语句

//             printf("将%d号盘子从%c移动到%c\n", n, A, C)此时n为2  A - A B - C, C - B 将2号从A移到B

//             hannio(1, B, A, C); B里面存放的是C, A里面存放的是A, C里面存放的是B 把C传给A, 把A传给B, 把B传给C A - C B - A C - B

//                    printf 将1号从A移到C 即从C移到B

//printf n = 3执行完毕, 此时n = 3, 将3号从A移到C

//     hannio(2, B, A, C) A-B B-A C-C

//             hannio(1, A, C, B) A-B B-C C-A A里面是B赋给A C里面是C赋给C B里面是A赋给C

//                    printf 将1号从B移到A

//             printf 此时n=2 将2号从B移到C

//             hannio(1, B, A, C); A-A B-B C-C 将一号从A移到C

将1号盘子从A移动到C
将1号盘子从A移动到C
将2号盘子从A移动到B
将1号盘子从C移动到B
将1号盘子从C移动到B
将3号盘子从A移动到C
将1号盘子从B移动到A
将1号盘子从B移动到A
将2号盘子从B移动到C
将1号盘子从A移动到C
将1号盘子从A移动到C
总共移动7次

 

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
汉诺塔问题是经典的递归问题,它的求解过程可以用递归算法实现。以下是汉诺塔问题的C语言递归算法分析。 1. 问题描述 汉诺塔问题是指有三根柱子A、B、C,在A柱子上从下往上按照大小顺序放置n个盘子,要求把这n个盘子移动到C柱子上,移动过程中可以借助B柱子,但是要满足以下条件: 1. 每次只能移动一个盘子; 2. 盘子不能放在比它小的盘子上面。 2. 递归实现 汉诺塔问题可以通过递归实现,具体实现过程如下: 1. 将n-1个盘子从A柱子移动到B柱子上,借助C柱子; 2. 将A柱子上最大的盘子移动到C柱子上; 3. 将n-1个盘子从B柱子移动到C柱子上,借助A柱子。 递归终止条件是只有一个盘子时直接将其从A柱子移动到C柱子上。 3. 代码实现 下面是汉诺塔问题的C语言递归算法实现代码: ```c #include <stdio.h> void hanoi(int n, char from, char to, char via) { if (n == 1) { printf("Move disk %d from %c to %c\n", n, from, to); } else { hanoi(n-1, from, via, to); printf("Move disk %d from %c to %c\n", n, from, to); hanoi(n-1, via, to, from); } } int main() { int n = 3; // 三个盘子 hanoi(n, 'A', 'C', 'B'); return 0; } ``` 代码中,hanoi函数用于求解汉诺塔问题,n表示盘子的个数,from表示起始柱子,to表示目标柱子,via表示中介柱子。在函数中,如果n等于1,则直接将盘子从起始柱子移动到目标柱子上;否则,递归地将n-1个盘子从起始柱子移动到中介柱子上,然后将最大的盘子从起始柱子移动到目标柱子上,最后递归地将n-1个盘子从中介柱子移动到目标柱子上。 在main函数中,首先定义了盘子的个数n,然后调用hanoi函数求解汉诺塔问题。 4. 总结 汉诺塔问题是经典的递归问题,通过递归算法可以简便地实现其求解过程。在实现时,需要注意递归的终止条件和递归调用的顺序。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值