首先是经典的汉诺塔问题:(写这个函数的时候,默认的是按照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