鱼C论坛

 找回密码
 立即注册

汉诺塔 递归详解

已有 374 次阅读2019-8-29 11:09

#include <stdio.h>

void move (int n , char x , char y , char z)
// x为起点柱,y为中转柱,z为终点柱
{
    if (n == 1)
    {
        printf("%c --> %c\n",x,z);
        // 把在x的最顶层的盘子只需要转到终点柱就行了,想想看你玩游戏第一个步骤就是这么搬的
    }
    else
    {
        // 以下呢,不妨想象最底层的盘子以上那好几十个盘子为一个整体的盘子,叫做厚盘子,这时候,就只有两个盘子了
        // 那怎么办呢?很简单,把厚盘子移到中转柱,再把最底的盘子移到终点柱,再把厚盘子搬过去不就行了
        // 那你可能会问,可你这样想,那厚盘子里也有那么多个啊,怎么处理?
        // 其实你再想想,我们把目光聚焦在那堆厚盘子,这时候,你会发现
        // 原来我们又可以用到上面提到的处理方法!这就开始山里有座庙,庙里有个和尚,和尚在讲故事,讲什么呢?
        // 讲着山里有座庙,庙里有个和尚,和尚在讲故事,讲什么呢......
        // 那你可能会问,那有好多层,什么时候停止呢?
        // 假设我们到最顶层,就停止了,因为我们不满足一个条件,就是我们没有在上面的盘子可以移动了
        // 这时候,我们只需要把它帮到终点站就行了,跳过第一,第三个步骤
        // 可能很多人会觉得我很难想象出那个搬运的过程,其实你只需要掌握那个循环的过程还有终点就行了
        // 因为去跟踪递归的每一步执行,是非常费劲的,可能只有两三个盘子我们人脑可以去模拟,多了就不行了
        // 递归的精髓是掌握架构,以下三句代码就是架构
        move(n-1 , x , z , y);
        // 把最底层的盘子以上n-1个盘子搬到中转站
        printf("%c --> %c\n",x,z);
        // 把最底层的盘子搬到终点柱
        move(n-1 , y , x , z);
        // 把中转柱那n-1个盘子搬过去终点柱
    }
}

int main ()
{
    int n ;
    scanf("%d",&n);
    move(n,'x','y','z');
    return 0 ;
}

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 02:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部