zoukankan      html  css  js  c++  java
  • 关于递归和汉诺塔

      汉诺塔这个问题很经典,不清楚题目的同学可以去百度一下,在这小子就不多说了,进入正题;

      让我们打开表格,看看这座塔:

      

      这塔看起来不咋地对不对?不过,我们的目标是把它原封不动的搬到c列上,可以借助b列。让我们从最简单的做起:假设只有两层,从下往上分别是1,2,这时候你会说这题目简直就是在侮辱你的智商!只需要三步:

        First.将2从a列移到b列;

        Second.将1从a列移到c列;

        Finally.将2从b列移到c列;

      很简单对不对?那现在,让我们做做完整版:64层!不要紧张,先试试将1之上的所有积木只当做一层,那么我们又回到了刚才那简单的两层问题。所以,我们有f(n)来表示n层问题的答案,把1之上的积木移到b列需要f(n-1)步,将1移到c列(需要1步),再将b列上的积木移到c列又需要f(n-1)步。所以,可以得到等式:

        f(n)=2*f(n-1)+1

      这就是我们的递归公式了。

      再看看步骤是如何输出的:

        先定义一个子函数,函数名怎样都可以,只要不与保留字重复,如:

          

    void f(int n,char a,char c,char b);
    //这里的参数所代表的意义是一个n层的汉诺塔,从a柱移到c柱上,其中可以借助b柱;
    

         1.然后,把1之上的积木从a列移到b列,期间是可以借助c列的:

          f(n-1,a,b,c);

         2.将1移到c列(这只有一步,不需借助其他列):

          printf("%d from %c to %c ",n,a,c);

        3.再将b列上的积木移到c列,借助a列(因为现在的a列是空闲的):

          f(n-1,b,c,a);

      说了那么多,让我们看看代码长什么样吧:

    #include<stdio.h>
    int t=0;//需要操作的总步数为t步
    void f(int n,char a,char c,char b);//把n盘从a柱移到c柱,借助b柱
    int main()
    {
        int n;
        scanf("%d",&n);
        f(n,'A','C','B');
        return 0;
    }
    void f(int n,char a,char c,char b)
    {
        if(n==0)    return;
        f(n-1,a,b,c);
        t++;//统计操作步数
        printf("%d:%d from %c to %c
    ",t,n,a,c);
        f(n-1,b,c,a);
    }
    

       代码有不足的还请包涵,有兴趣的同学可以跟踪一下它的执行过程,可以帮助你更好的了解递归算法的实现方式。

      

        

  • 相关阅读:
    590. N-ary Tree Postorder Traversal
    C++——指针3
    C++——指针2-指向数组的指针和指针数组
    C++——指针1
    C++——二维数组和对象数组
    C++——一维数组
    C++——程序的结构
    C++——类与对象
    C++——函数
    C++——简单程序设计
  • 原文地址:https://www.cnblogs.com/LegendLa/p/4508797.html
Copyright © 2011-2022 走看看