1.故事介绍

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上依照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从以下開始按大小顺序又一次摆放在还有一根柱子上。而且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次仅仅能移动一个圆盘。

2.由来

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

无论这个传说的可信度有多大,如果考虑一下把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亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

3.汉诺塔的代码

#include <iostream>

void han(int n, char A, char B, char C)

{

 static int  num = 1;

 //std::cout << "第" << num << "次";

 num++;

 if (n == 1)

 {

  std::cout <<"将盘子"  << n <<" 从 "<< A << "移动到" << C << std::endl;

  return;

 }

 else

 {

  han(n - 1, A, C, B);

  //std::cout << A << "->" << C << std::endl;

  std::cout << "将盘子" << n << " 从 " << A << "移动到" << C << std::endl;

  han(n - 1, B, A, C);

 }

}

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

//2^64- 1

void main()

{

 int n;

 std::cin >> n;

 std::cout << "n=" << n << std::endl;

 han(n, 'A', 'B', 'C');

std::cin.get();

 std::cin.get();

}

执行结果例如以下:

面向对象的方式解决这个问题:

#include <iostream>

class han
{
private:
/*盘子个数*/
int num; public:
void hanoi(int n, char A, char B, char C)
{
static int num = 1;
num++;
if (n == 1)
{
std::cout << "将盘子" << n << " 从 " << A << "移动到" << C << std::endl;
return;
}
else
{
hanoi(n - 1, A, C, B);
std::cout << "将盘子" << n << " 从 " << A << "移动到" << C << std::endl;
hanoi(n - 1, B, A, C);
}
} /*getter setter*/
void setNum(int num)
{
this->num = num;
}
int getNum()
{
return this->num;
}
}; int main(int argc,char *argv[])
{
int num;
std::cout << "请输入盘子的个数:" << std::endl;
std::cin >> num;
std::cout << "输入盘子的个数是:" << num << std::endl; han hanoi;
hanoi.setNum(num);
hanoi.hanoi(hanoi.getNum(),'A','B','C'); std::cin.get();
std::cin.get();
}

执行效果:

4.结果推算步骤演示:

关于汉诺塔,C++代码,代码效果演算的更多相关文章

  1. python3汉诺塔简单实现代码

    小时候喜欢玩汉诺塔,今天用python实现简单的汉诺塔功能 代码: def hannoi(n,x,y,z): if n==1: print(x,'-->',z) else: hannoi(n-1 ...

  2. 题目---汉诺塔及AI代码及八皇后

    2019春第十一周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering ...

  3. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  4. 杭电oj1995——汉诺塔V(java实现)

    正文之前,先说下做这题的心路历程(简直心累) 这是今天下午的第一道题 第一次看到题目标题——汉诺塔 内心OS:wc,汉诺塔诶,听名字就很难诶,没做过诶,肯定很难实现吧,不行,我得去看看讲解 然后就上b ...

  5. Hanio汉诺塔代码递归实现

    1.背景介绍 Hanio (汉诺塔,又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  6. java笔记--代码实现汉诺塔移动过程和移动次数

    汉诺塔 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方. --如果朋友 ...

  7. javascript实现汉诺塔动画效果

    javascript实现汉诺塔动画效果 当初以为不用html5也很简单,踩了javascript单线程的大坑后终于做出来了,没事可以研究下,对理解javascript的执行过程还是很有帮助的,代码很烂 ...

  8. [js - 算法可视化] 汉诺塔(Hanoi)演示程序

    前段时间偶然看到有个日本人很早之前写了js的多种排序程序,使用js+html实现的排序动画,效果非常好. 受此启发,我决定写几个js的算法动画,第一个就用汉诺塔. 演示地址:http://tut.ap ...

  9. 化繁为简 经典的汉诺塔递归问题 in Java

    问题描述   在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑 ...

随机推荐

  1. CGRectInset、CGRectOffset、等对比整理

    http://blog.sina.com.cn/s/blog_76f3236b01013zmk.html   分类: iphone有关 1.CGRectInsetCGRect CGRectInset ...

  2. 基于UDP高性能传输协议UDT doc翻译(一)

    原文转自:http://hi.baidu.com/doodlezone/item/74a203155efe26dbbf9042dd                  UDT文档阅读理解 一.  概述 ...

  3. kubernetes 搭建集群内服务

    nginx-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: webapp spec: replicas: 2 te ...

  4. Windows8 上用Ubuntu-Ubuntu启动SSH

    公司刚给配了一个电脑,华硕的超级本8个G的内存,很强大的了,但是系统是64位的windows 8,我用wubi.exe直接安装到系统上,但是开机启动的时候总是下面这个错误,去Ubuntu社区请教,结论 ...

  5. A/B Testing with Practice in Python (Part Two)

    This is the second part of A/B testing notes, which contains the practical issues and alternatives o ...

  6. 「kuangbin带你飞」专题十七 AC自动机

    layout: post title: 「kuangbin带你飞」专题十七 AC自动机 author: "luowentaoaa" catalog: true tags: - ku ...

  7. 牛客小白月赛6 指纹锁(set容器的骚操作)

    原题地址: 题目描述     HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁.     该指纹锁的加密算法会把一个指纹转化为一个不超过1e7的数字,两个指纹数值之差越小,就说 ...

  8. 【译】PHP之道(PHP the right way)

    刚入门的同学觉得自己能用PHP写出各种程序就很NB了,但其实作为一个专业程序员,你得有个全面点的知识结构.单元测试总得听过,文档工具总得用用,Xss总得会防.推荐大家把<PHP the righ ...

  9. SQL数据库学习系列之一

    数据库知识的重要性不言而喻,以下链接给出了最最基础知识的讲解. 第一讲:SQL 语法 第二讲:SQL SELECT 语句 第三讲:SELECT DISTINCT 语句 第四讲:SQL WHERE 子句 ...

  10. 基于Prometheus,Alermanager实现Kubernetes自动伸缩

    到目前为止Kubernetes对基于cpu使用率的水平pod自动伸缩支持比较良好,但根据自定义metrics的HPA支持并不完善,并且使用起来也不方便. 下面介绍一个基于Prometheus和Aler ...