用函数递归的方法解决古印度汉诺塔hanoi问题

问题源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

我们把柱子依次命名为A,B,C

从只有一个圆盘考虑:直接就是A-->C

两个圆盘的时候就是:A-->B,A-->C,B-->C

三个圆盘的时候就是:A-->C,A-->B,C-->B,A-->C,B-->A,B-->C,A-->C

其中标红色的步骤就是将原有最底下的圆盘从A-->C,执行这个步骤前我们可以发现实际上是先将A最底下大盘上的所有圆盘(即n-1)都移到B上,接着执行A-->C,最后再将B上n-1个圆盘从B移到C上,不难发现要将n-1个圆盘从B移到C上,也就是要借助A,将n-2个圆盘从B移到A上,这样才能将B上最底下圆盘移到C上。

def _move(n, a, b, c):
    if n == 1:                  # 只有一个圆盘时直接从A-->C
        print(‘move:‘, a, ‘-->‘, c)
    else:
        _move(n - 1, a, c, b)         # 现将n-1个圆盘从A-->B
        _move(1, a, b, c)            # 接着将原有A中最底下圆盘从A-->C
        _move(n - 1, b, a, c)         # 最后借助A,将B中n-1个圆盘从B-->C

m = int(input(‘请输入hanoi塔个数:‘))
print(‘移动的步骤如下:‘)
_move(m, ‘A‘, ‘B‘, ‘C‘)

原文地址:https://www.cnblogs.com/xuminzgl/p/11917300.html

时间: 2024-10-13 18:43:39

用函数递归的方法解决古印度汉诺塔hanoi问题的相关文章

数据结构与算法—递归(阶乘、斐波那契、汉诺塔)

目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单:递归通常可以简单的处理子问题,但是不一定是最好的.对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作,只关心初始条件和上下层的变化关系. 递归函数需要有临界停止点,即递归不能无限制的执行下去.通常这个点为必须经过的一个数. 递归通常能被其他方案替代(栈.数组正向求). 认识递归,递归函数通常简易但是对于初学者可能很难取理解它.拿一个递归

5-17 汉诺塔的非递归实现 (25分)

5-17 汉诺塔的非递归实现   (25分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标柱(标记为"c"),并保证每个移动符合汉诺塔问题的要求. 输入格式: 输入为一个正整数N,即起始柱上的盘数. 输出格式: 每个操作(移动)占一行,按柱1 -> 柱2的格式输出. 输入样例: 3 输出样例: a -> c a -> b c -&g

7-17 汉诺塔的非递归实现

7-17 汉诺塔的非递归实现(25 分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标柱(标记为"c"),并保证每个移动符合汉诺塔问题的要求. 输入格式: 输入为一个正整数N,即起始柱上的盘数. 输出格式: 每个操作(移动)占一行,按柱1 -> 柱2的格式输出. 输入样例: 3 输出样例: a -> c a -> b c ->

汉诺塔的非递归实现(栈)

汉诺塔的非递归实现(栈) 美国学者找的规律:若是偶数,将a.b.c顺时针排列,否则a.c.b排列,然后反复做: (1)最小盘顺时针移动一个 (2)那两个柱子将最小的移动了,空的话直接移 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标柱(标记为"c"),并保证每个移动符合汉诺塔问题的要求. 输入格式: 输入为一个正整数N,即起始柱上的盘数. 输出格式:

汉诺塔递归解决方法经典分析

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

Python函数递归之汉诺塔

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上. 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 汉诺塔的移动问题,汉诺塔的三个圆柱分别标注为A.B.C,圆盘开始是在A圆柱上面并上从下往上按照大小顺序摞着圆盘,需要将其移动到 C圆柱,递归的思路是: (1)A上的的圆盘个数n = 1,那么很直接,直

编程:递归编程解决汉诺塔问题(用java实现)

//Li Cuiyun,October 14,2016.//用递归方法编程解决汉诺塔问题package tutorial_3_5;import java.util.*; public class HanoiTower { public static void main(String[] args) { // TODO Auto-generated method stub @SuppressWarnings("resource") Scanner sc=new Scanner(Syste

C#递归解决汉诺塔问题(Hanoi)

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExample_Hanoi_{    class Program    {        static void Main(string[] args)        {            HanoiCalculator c = new HanoiCalculator();            Cons

递归解决汉诺塔问题

汉诺塔问题:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,求至少需要多少次移动. 我们首先假设n=1,那么move(n)=1,因为这时候只需要从A->C便可以.接下来假设n=2,那么move(n)=3 即A->B,A->C,B->C; 假设n=3,move(n)=7 即A->C,A->b,C->B,A->C,B->A,B-