温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言中的汉诺塔公式是什么

发布时间:2022-01-21 09:44:06 来源:亿速云 阅读:204 作者:小新 栏目:开发技术

这篇文章主要为大家展示了“C语言中的汉诺塔公式是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中的汉诺塔公式是什么”这篇文章吧。

    汉诺塔公式

    汉诺塔问题在数学层面的公式:

    C语言中的汉诺塔公式是什么

    不用说,你看到这个公式一定一脸懵逼,我现在来讲解这个公式的作用。

    先来回想一下大象放冰箱要几步,三步吧,打开冰箱,放进去,关上门就行了,我们先不要去思考一些细碎的步骤,将一个复杂的问题先简单化,再慢慢去分析。

    那汉诺塔问题也是同样的简单三步:(假设有n个盘子)

    一、把最大的盘子留在A柱,然后将其他的盘子全放在B柱。

    二、把最大的盘子放到C柱。

    三、然后将B柱上的所有盘子放到C柱。

    这就是汉诺塔的流程,汉诺塔的精髓就是上面三句话。

    n层汉诺塔有(2^n-1)次移动,来将盘子全部从A盘到C盘.

    C语言递归公式

    相应我们可以写出对应的C语言递归公式:(n就是盘子的个数,xyz就是柱子的名字)

    C语言中的汉诺塔公式是什么

    相信你肯定有很多疑问,我们现在先来举几个例子再解释问题吧。

     一个盘子就不说了,因为最大的盘子就是他,所以他直接就去C盘了。

    两层汉诺塔

    共三步:把最大盘上面的全部放到B,然后最大盘去C,再把剩余的盘全部放到C就行了。

    C语言中的汉诺塔公式是什么

    这是两个盘,共移动三次就移动完了,那三个盘呢?

    三层汉诺塔

    C语言中的汉诺塔公式是什么

     把全部过程堪称一个整体,最大盘上面的所有盘全部看成一个整体,我们也只用执行三个步骤,我们要利用把大事化小的观点,不要一上来就思考具体是怎么移动的,这样看不清问题的本质。

    我们再来具体分析三步具体要怎么移动.

    第一步中,我们要移动三次,分别是A->C、是A->B、C->B这就是一大次完整的移动,在这一步中,我们套用了上一次的汉诺塔公式进行使用,这就是汉诺塔的难点,接下来我给大家看个图,希望大家能理解,(n是层数,X,Y,Z则是函数参数)

    C语言中的汉诺塔公式是什么

     汉诺塔的内部其实就像一个金字塔一样,其实每一次调用自己,就是按照上面所说精髓的公式调用自己,让自己的参数发生了变化。我希望大家能够自己去照着画一下流程,

    第二步:将A到C,这就是将上图的第二步那写上第四次移动:A->C。

    第三步,将B柱上的全部盘子借助A放到C

    C语言中的汉诺塔公式是什么

    第七步完成后就会发现没有要执行的语句了,汉诺塔函数就结束返回到main函数了,自此求解汉诺塔函数的步骤就完成了。

    好的,这样,我们移动三层汉诺塔的过程的就完成了,三次汉诺塔完成就算是解决了这个问题,因为即使盘子再多也就是一样的公式套用而已,明白两层和三层汉诺塔的运行原理就可以了,再多层的塔也是相同的流程。不难发现,递归就是让数学公式在C语言中体现了出来,让问题变的十分”简单“。

    剩下就是了程序的主函数部分了,这个问题的主函数就很简单,主函数只用传来盘子的数量和三个柱子的名字就行了;代码如下

    #include <stdio.h>
    void change (char x,char y)     //打印盘子移动轨迹的函数
    {
        printf("%c->%c\n", x, y);
    }
    void f(n, x, y, z)              //汉诺塔函数
    {
        if (n == 1)
        {
            change(x, z);
        }
        else
        {
            f(n - 1, x, z, y);      //公式一:将A柱最大盘外的盘子借助C柱移到B柱
                change(x, z);       //公式二:将A上最大盘移动到C柱
            f(n - 1, y, x, z);      //公式三:将B柱上的盘借助A全部放到C柱
        }
    }
    int main()
    {
        int m;
        scanf("%d", &m);
        f(m, 'A', 'B', 'C');
    }

    以上是“C语言中的汉诺塔公式是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI