汉诺塔

汉诺塔

折月煮酒 提交于 2019-12-03 23:34:03
#练习 # 汉诺塔的移动可以用递归函数非常简单地实现。 # # 请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,例如: # -*- coding: utf-8 -*- def move(n, a, b, c): if n == 1: print(a, '-->', c) else: move(n-1,a,c,b) print(a, '-->', c) move(n-1,b,a,c) move(3, 'A', 'B', 'C') move(4, 'A', 'B', 'C') 来源: https://www.cnblogs.com/yezuocheng/p/11811437.html

递归理解-汉诺塔问题

梦想与她 提交于 2019-12-03 05:34:51
汉诺塔问题 汉诺塔问题的求解可以巧妙利用递归思想 以下摘自知乎上我认为阐述得很清除回答: 要用程序来解决这个问题,我们先定义一个移动函数:move(移动数,开始柱,中转柱,目标柱), 例如 move(2,A,B,C) 表示将2个盘子从A柱(开始柱)借助B柱(中转柱)移动到C柱(目标柱)。 关于开始柱,中转柱,目标柱这三个概念可以用移动过程中的某个状态来理解, 看下面一张图应该就能明白: 有三种状态的柱子,开始柱,中间柱,目标住,开始柱指的是开始状态时存放所有盘子的柱子,中转柱指的是中间状态时暂时存放n-1个(三层就是3-1个)盘子的柱子, 目标柱指的是盘子最终要移动到的柱子。这里需要注意,开始柱,中转柱,目标柱并不是一成不变的,而是会根据层次的不同而改变。(如果这里暂时不能理解的话,先读下去,再回头你就能明白了)。 接着我们分情况讨论一下盘子的移动: 情况一 当盘子只有1个(调用 move(1,A,B,C))当盘子只有一个的时候, 只要直接将盘子从开始柱移动到目标柱就可以了,并没有中间状态(即不用借助中转柱),在move方法中可以用一句话表示该移动动作 print('A--->C'); 情况二 当盘子有2个(调用 move(2,A,B,C))这个情况分三个步骤进行: step1. 把除了最大的盘子之外的盘子从A移到BA--->B (开始柱--->中转柱) 【相当于调用 move(1

汉诺塔(Hanoi)问题递归&非递归的C++实现及总结

时间秒杀一切 提交于 2019-12-03 03:21:24
汉诺塔(Hanoi)问题递归&非递归的C++实现及总结 由于刚入门不算很久,所以就那汉诺塔这种简单问题来练下手啦~~ 【汉诺塔问题内容】 (虽然路人皆知但还是写一下好了。。。)   相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。   详细的背景可以去 百度百科 自己看~~ 【递归实现】 //汉诺塔问题最简单最经典的解决方法当然是递归解决啦~~ #include <iostream> using namespace std ; void hanoi( int n, int a, int b, int c) { if (n > 0 ) { hanoi(n- 1 , a, c, b); cout << "move " << a << " to " << b << endl; hanoi(n- 1 , c, b, a); } } int main() { int n; cin >> n; hanoi(n, 1 , 2 , 3 ); return 0 ; } //非常简单就搞定了

递归经典问题----汉诺塔问题

对着背影说爱祢 提交于 2019-12-03 03:20:48
汉诺塔: 问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 这个经典的问题完全可以区分一个人是否学过计算机。 touch here:汉诺塔维基百科地址传送门 他在维基百科上的解释是:The Tower of Hanoi (also called the Tower of Brahma or Lucas’ Tower[1] and sometimes pluralized) is a mathematical game or puzzle. It consists of three rods and a number of disks of different sizes, which can slide onto any rod. The puzzle starts with the disks in a neat stack in ascending order of size on one rod, the smallest at the top, thus making a conical shape. The objective of the puzzle

递归与动态规划---汉诺塔问题

眉间皱痕 提交于 2019-12-03 03:19:51
【问题】   给定一个整数n,代表汉诺塔游戏中从小到大放置的n个圆盘,假设开始时所有的圆盘都放在左边的柱子上,想按照汉诺塔游戏的要求把所有的圆盘都移到右边的柱子上,实现函数打印最优移动轨迹。 【举例】   n = 2时,打印:   move from left to mid   move from left to right   move from mid to right 【基本思路】 假设有left柱子,mid柱子和right柱子,都在left柱子的圆盘1~i完全移动到right,最优的过程为: 将圆盘1~i-1从left移动到mid 将圆盘i从left移动到right 将圆盘1~i-1从mid移动到right 如果盘子只有一个,直接从left移动到right即可 下面是使用python3.5实现的代码 #汉诺塔问题 def hanoi (n) : def func (n, left, mid, right) : if n == 1 : print( "move from " + left + " to " + right) else : func(n- 1 , left, right, mid) func( 1 , left, mid, right) func(n- 1 , mid, left, right) if n < 1 : return return func(n,

递归和循环----汉诺塔

偶尔善良 提交于 2019-12-03 03:19:37
题目: 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作? 有两个限制条件,第一个是每次只能够移动一个圆盘,第二个是大圆盘只能在小圆盘下面 思路: 如果1个盘子,你直接可以从第一根柱子移动到最后一根柱子就可以了 如果有两个盘子,第一你需要先把上面的盘子,从start柱子移动到middle柱子去,第二需要把下面的盘子,移动到最后那个盘子中最后那个柱子上,最后把上面的盘子从middle柱子上移动到end柱子上。 假设n个盘子,即函数f(n),第一步把上面的n-1盘子通过end那个空柱子最终移动到middle柱子,第二步把下面的大盘子移动到end柱子上去,第三步把上面的n-1个盘子通过start这个空柱子按照限制条件移动到end柱子上去 /** * 汉诺塔 * * @param n 盘子的数量 * @param start 开始柱子 * @param middle 中介柱子 也就是那个空闲柱子 * @param end 放结果柱子 也就是你通过移动,将这个盘子移动到哪个柱子上 *

《程序员的数学》:汉诺塔问题(Hanoi问题)的递归算法与非递归算法总结

佐手、 提交于 2019-12-03 03:18:05
如果对汉诺塔算法的理解有困难,建议查看 《程序员的数学》:第6章 递归——自己定义自己 这一章作者详细用图形介绍了汉诺塔递归算法,便于理解,茅塞顿开! 现对该算法从递归和非递归两个方面做如下总结: 1.递归算法分析 如下, 设A上有n个盘子。 如果n=1,则将圆盘从A直接移动到C。 如果n=2,则: (1)将A上的n-1(等于1)个圆盘移到B上; (2)再将A上的一个圆盘移到C上; (3)最后将B上的n-1(等于1)个圆盘移到C上。 如果n=3,则: A)将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),步骤如下: (1)将A上的n`-1(等于1)个圆盘移到C上。 (2)将A上的一个圆盘移到B。 (3)将C上的n`-1(等于1)个圆盘移到B。 B)将A上的一个圆盘移到C。 C)将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),步骤如下: (1)将B上的n`-1(等于1)个圆盘移到A。 (2)将B上的一个盘子移到C。 (3)将A上的n`-1(等于1)个圆盘移到C。到此,完成了三个圆盘的移动过程。 从上面分析可以看出,当n大于等于2时, 移动的过程可分解为三个步骤: 第一步 把A上的n-1个圆盘移到B上; 第二步 把A上的一个圆盘移到C上; 第三步 把B上的n-1个圆盘移到C上; 其中第一步和第三步是类同的。 当n=3时,第一步和第三步又分解为类同的三步,即把n`

数据结构与算法---汉诺塔

给你一囗甜甜゛ 提交于 2019-12-03 03:17:05
#include<stdio.h> void Hanoi(int n,char a,char b,char c) { if(n==1) printf("move %c to %c \n",a,c); else { Hanoi(n-1,a,c,b); printf("move %c to %c \n",a,c); Hanoi(n-1,b,a,c); } } void main() { int n; char A = '1',B = '2',C = '3'; printf("enter the number of disks"); scanf("%d",&n); printf("the solution for n = %d\n",n); Hanoi(n,A,B,C); } 来源: CSDN 作者: yinhua405 链接: https://blog.csdn.net/yinhua405/article/details/70232223

算法-图解汉诺塔原理-python3实现-可输出圆盘编号

孤街醉人 提交于 2019-12-03 03:15:58
0.摘要 本文使用python3实现汉诺塔问题。  1.问题阐述与分析 有三个柱子A,B,C,每个柱子上都可以放置圆盘。最初,所有圆盘都在A柱子上,需要把所有圆盘都移动到C柱子上。 要求: 1.每次只移动一个圆盘 2.只能移动柱子最上面的圆盘 3.保证每根柱子上,上面的圆盘一定比下面的圆盘小 经过分析,我们发现,这样的问题可以分解为下面三个子步骤 step1 :如果想把A柱子上的圆盘都移动到C柱子上,那么必须先 想办法 把A柱子上n-1个圆盘移动到B柱子上。 不难看出,“把A柱子上圆盘移动到B柱子上”和“把A柱子上的圆盘都移动到C柱子上”,这是同一类问题。区别只不过圆盘数量变为了n-1,source是A柱子,target是B柱子。 step2 :这时候可以把最大的圆盘移动到C柱子上。并且由于这个圆盘是最大的,所以其他任意圆盘都可以放在C柱子上。这时候的C柱子,和空柱子具有相同的作用。 step3 :这时候,我们发现,问题转换成了如何把B柱子上n-1个圆盘移动到C柱子上? 不难看出,“把B柱子上圆盘移动到C柱子上”和“把A柱子上的圆盘都移动到C柱子上”,又是同一类问题。区别只不过圆盘数量变为了n-1,source是B柱子,target是C柱子。 2.代码实现 通过上面的分析,我们发现: 当需要移动的圆盘数量n=1时,直接移动圆盘即可; 当需要移动的圆盘数量n>1时

算法详解--汉诺塔

て烟熏妆下的殇ゞ 提交于 2019-12-03 03:15:32
算法由来 小故事 汉诺塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家Edouard Lucas曾提及这个故事,据说创世 纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根 石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。 我们来把这个故事变成一个算法: 把三个柱子标为ABC 如果只有一个盘子时,将它直接搬到c,当有两个盘子,就将B做为辅助。如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是 A->B A->C B->C这三个步骤,而被遮住的部分是一个递归处理。如果有n个盘子,则移动完毕所需的次数为2^n-1。 如图: 事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1,所以当盘数为64时,则所需次数为: 264- 1 = 18446744073709551615 为5.05390248594782e+16年,也就是约5000世纪,如果对这数字没什么概念,就假设每秒钟搬一个盘子好了,也要约5850亿年左右。