今天学廖雪峰的python教程看到汉诺塔问题,就重新复习一下
汉诺塔问题
算法思路
分三步走(假设三个座A、B、C,共n个盘子)
- 将n-1个盘子借助C座,将A移到B
- 将最后一个盘子从A移到C
- 将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的构造规则;汉诺塔中取打印移动盘子步骤为基本元素,并整理出移动盘子的规则。