关于递归和汉诺塔

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

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

  

  这塔看起来不咋地对不对?不过,我们的目标是把它原封不动的搬到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);
}

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

  

    

原文地址:https://www.cnblogs.com/LegendLa/p/4508797.html