zoukankan      html  css  js  c++  java
  • 递归算法之汉诺塔的实现

      一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 

      不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。

      假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:

    18446744073709551615秒

      这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

     

      如果用非递归的方法来实现,代码将非常复杂,那么用递归的方式,代码如何呢?如下。dart语言实现。

     1 int _count = 0;
     2 
     3 void hanoi(int n) {
     4   _hanoi(n, 'A', 'B', 'C');
     5   print('---------------------------');
     6   print('total moved: $_count times.
    ');
     7 }
     8 
     9 void _hanoi(int n, String origin, String assist, String destination) {
    10   if (n == 1) {
    11     _move(origin, destination);
    12   } else {
    13     _hanoi(n - 1, origin, destination, assist);
    14     _move(origin, destination);
    15     _hanoi(n - 1, assist, origin, destination);
    16   }
    17 }
    18 
    19 void _move(String from, String to) {
    20   _count++;
    21   print('move $_count times:	from $from to $to');
    22 }
    _count 用来记录移动次数,_move 表示从柱子 from 移动到 柱子 to.

     

  • 相关阅读:
    发现个atan2的正确使用方式
    Forward+ Shading架构
    fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error 解决方案
    HDFS HA(高可用性)集群规划
    如何使用RTP引擎对语音编码进行转码
    关于 Angular 应用 tsconfig.json 中的 target 属性
    浅谈 Orbeon form builder 的权限控制
    关于 Angular 应用 tsconfig.json 中的 lib 属性
    orbeon form 通过 url 的方式同第三方应用集成的开发明细
    orbeon form 的配置介绍
  • 原文地址:https://www.cnblogs.com/outerspace/p/10827918.html
Copyright © 2011-2022 走看看