[Python3]闭包实现求阶乘和经典汉诺塔问题递归求解

首先是经典的汉诺塔问题:(写这个函数的时候,默认的是按照y为开始放有盘子的柱子,z为目标柱子,x为辅助柱子,n为盘子的总数)

def hanoi(n, x, y, z):   #  y -> z is our goal, x is a helper
	if n == 1:
		print(y, "->", z)
		return
	hanoi(n-1, z, y, x)
	print(y, "->", z)
	hanoi(n-1, y, x, z)

调用结果:

hanoi(6, "开始为空的柱子", "开始有6个盘子的柱子", "目标柱子")
开始有6个盘子的柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 目标柱子
开始为空的柱子 -> 目标柱子
开始有6个盘子的柱子 -> 开始为空的柱子
目标柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 目标柱子
开始为空的柱子 -> 目标柱子
开始为空的柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始有6个盘子的柱子
开始为空的柱子 -> 目标柱子
开始有6个盘子的柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 目标柱子
开始为空的柱子 -> 目标柱子
开始有6个盘子的柱子 -> 开始为空的柱子
目标柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 开始为空的柱子
目标柱子 -> 开始有6个盘子的柱子
开始为空的柱子 -> 目标柱子
开始为空的柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 目标柱子
开始为空的柱子 -> 目标柱子
开始有6个盘子的柱子 -> 开始为空的柱子
目标柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 目标柱子
开始为空的柱子 -> 目标柱子
开始为空的柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始有6个盘子的柱子
开始为空的柱子 -> 目标柱子
开始有6个盘子的柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 目标柱子
开始为空的柱子 -> 目标柱子
开始为空的柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 开始为空的柱子
目标柱子 -> 开始有6个盘子的柱子
开始为空的柱子 -> 目标柱子
开始为空的柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始有6个盘子的柱子
开始为空的柱子 -> 目标柱子
开始有6个盘子的柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 目标柱子
开始为空的柱子 -> 目标柱子
开始有6个盘子的柱子 -> 开始为空的柱子
目标柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 目标柱子
开始为空的柱子 -> 目标柱子
开始为空的柱子 -> 开始有6个盘子的柱子
目标柱子 -> 开始有6个盘子的柱子
开始为空的柱子 -> 目标柱子
开始有6个盘子的柱子 -> 开始为空的柱子
开始有6个盘子的柱子 -> 目标柱子
开始为空的柱子 -> 目标柱子

然后是闭包求阶乘:

>>> def recursion(num):
	def cal(re = 1, i = 1):
		if i == num:
			return re*i
		return cal(re*i, i+1)
	return cal

>>> recursion(10)()
3628800
>>> 10*9*8*7*6*5*4*3*2
3628800

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值