欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Python来解决卡诺塔即递归问题

程序员文章站 2022-04-13 15:43:41
...

当我们定义一个函数时,可以在函数中调用其他函数,而若当调用函数本身时,这时就被称之为迭代

而迭代的典型应用之一就是汉诺塔问题。汉诺塔问题可以描述为,现在有三个柱子,分别为A、B、C,而在A上按照从上到下越来越大的顺序放着n个圆盘,现在需要将这些圆盘移动到C柱子上,要求在移动的过程中仍然遵守从上往下越来越大的顺序,即大盘子不能放在小盘子上请输出将盘子从A移动到C上的步骤。

显而易见,当n=1时,步骤如下:

A>>C

当n=2时,步骤如下:

A>>B

A>>C

B>>C

当n=3时,步骤如下:

A>>C

A>>B

C>>B

A>>C

B>>A

B>>C

A>>C

那么聪明的你,是否注意到,当n=1时,仅需1步,当n=2时,需要3步,当n=3时,需要7步,那么是否对于n个圆盘,需要的步骤为\[2^{n}-1\]

可以注意到的是,对于A(起始)上的n个卡诺塔,需要将前n-1个卡诺塔移动到B(中介柱)上,然后再把第n个卡诺塔移动到C(目标)上,最后再从B上(中介)把前n-1个卡诺塔移动到C(目标)上。如果设n个卡诺塔的步数为f(n),则\[f(n)=f(n-1)+1+f(n-1)=2*f(n-1)+1=2^{n}-1\]

那么,该模型可以抽象为:对于n个盘子的情况,先将A上的前n-1个盘子移动到B(也就是对应于当只有n-1个盘子的情况时,从A移动到B),再将第n个盘子从A移动到C,最后将B上的n-1个盘子移动到C(也就是对应于当只有n-1个盘子的情况时,从B移动到C),那么从此入手可以有

# -*- coding: utf-8 -*-
def move(n, a, b, c):
	if n == 1 :
		print( '%s>>%s'%( a , c ) );
	else:
		move(n-1 , a , c , b)
		print( '%s>>%s'%( a , c ) );
		move(n-1 , b , a , c)

当n =4 时,调用为

move( 4 , 'A' , 'B' , 'C' )

调用结果为

使用Python来解决卡诺塔即递归问题

聪明的你,可否来验证一下,结果是否正确呢?


相关标签: python 汉诺塔