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

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

而迭代的典型应用之一就是汉诺塔问题。汉诺塔问题可以描述为,现在有三个柱子,分别为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' )

调用结果为


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值