汉诺(Hanoi)塔问题总结

今天学廖雪峰的python教程看到汉诺塔问题,就重新复习一下

汉诺塔问题

算法思路

三步走(假设三个座A、B、C,共n个盘子)

  1. 将n-1个盘子借助C座,将A移到B
  2. 将最后一个盘子从A移到C
  3. 将n-1个盘子借助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)
		move(1, a, b, c)
		move(n-1,b, a , c)

代码解释:else:后面的三个move()对应三步思路,注意在n==1时,移动最后一个盘子,并打印出步骤

总结算法

汉诺塔问题是一个典型的递归算法,关键是化繁为简的思想——整理出算法的一般规则,然后根据函数自身的调用来实现算法。

补充:递归的定义

维基上递归的定义:

  • 递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法

递归的定义主要用于定义无限集合,因为定义无限集合不可能列举出所有元素,对于一些大的集合也是如此。

所谓递归的定义由两部分组成:第一部分称为锚(anchor)或者基例(ground case),列出了产生集合中其他元素的基本元素;第二部分给出由基本元素或已有对象产生新对象的构造规则。这些规则被反复使用,从而产生新的对象。举个例子,要构造自然数集合,取0为基本元素,并给出累加1的构造规则;汉诺塔中取打印移动盘子步骤为基本元素,并整理出移动盘子的规则。

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/weixin_40957741/article/details/82901750
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞