zoukankan      html  css  js  c++  java
  • 汉诺塔

    这是一个很典型的递归题目,有助于理解递归思想。

    规则如下:

    我们不妨自定义一个函数,用来移动盘

    void hannuo(int n,char a,char b,char c) 含义:a上的n个盘子要通过b的中转移动到c上

    好,那么这个函数怎么实现打印路径的功能呢?

      如果n==1那么直接把盘子从a移动到c上就行啦,所以打印a->c(需要注意的是这里的a、c都是参数,是变量)

      如果n!=1那么肯定有多于一个的盘子,那怎么把这n个盘子移动到c上呢?

          分为三步:第一步——把上面的n-1个盘子通过c的中转移动到b上(hannuo(n-1,a,c,b))

            第二步——把最底下的盘子(现在已经是最上面的了)移动到c上(打印a->c)

            第三步——把b上的n-1个盘子再通过a的中转移动到c上(hannuo(n-1,b,a,c))

    如此,递归便完成啦。下面是代码:

     1 #include<stdio.h>
     2 
     3 void hannuo(int n,char a,char b,char c)
     4 {
     5     if (1==n) {
     6         printf("%c->%c
    ",a,c);
     7     }
     8     else {
     9         hannuo(n-1,a,c,b);
    10         printf("%c->%c
    ",a,c);
    11         hannuo(n-1,b,a,c);
    12     }
    13 }
    14 
    15 int main()
    16 {
    17     int k;
    18     scanf("%d",&k);
    19     hannuo(k,'a','b','c');
    20     return 0;
    21 } 

    再加深一下理解的话可以看这个图:

     

    另外,如果只需要计算最小的移动步数的话直接用递推公式就行了。

    f[1]=1

    f[n]=f[n-1]*2+1

    看懂了上面的递归函数的移动过程,这个公式也很容易理解啦。

    再数学推导一下的话,可以直接用公式 f[n]=2^n-1

  • 相关阅读:
    MYSQL--事务处理
    phpStudy + JspStudy 2014.10.02 下载
    ThinkPHP实现跨模块调用操作方法概述
    ThinkPHP整合百度Ueditor图文教程
    PHP获取今天、昨天、明天的日期
    获取客户端IP地址定位城市信息
    samba服务器概述
    Linux下好玩的命令
    一张网页的旅行
    PHP获取中英文混合字符串长度及截取
  • 原文地址:https://www.cnblogs.com/itlqs/p/4754495.html
Copyright © 2011-2022 走看看