一、在讲汉诺塔问题之前先普及几个细节问题:(汉诺塔问题在最后)
1.可用global定义全局变量
2.函数内可以嵌套函数,但是内部函数的整个定义,都在外部函数之内
3.函数的闭包:外层函数返回内层函数的函数名
>>> def A(x):
print('第一次输出:',x)
def B(x):
print(x*x)
B(x)
return B
>>> A(5)(6)
第一次输出: 5
36
>>> def A(x):
print('第一次输出:',x)
def B(x):
print(x*x)
B(x)
return B
>>> A(5)
第一次输出: 5
<function A.<locals>.B at 0x0000016CCEB85D08>
>>> A(5)(6)
第一次输出: 5
36
>>> i=A(5)
第一次输出: 5
>>> i
<function A.<locals>.B at 0x0000016CCEB85B70>
>>> type(i)
<class 'function'>
>>> i(7)
49
4.nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量:
>>> def A():
count=0
def B():
count+=1
return count
return B
>>> A()
<function A.<locals>.B at 0x0000016CCEB85D08>
>>> A()()
Traceback (most recent call last):
File "<pyshell#53>", line 1, in <module>
A()()
File "<pyshell#51>", line 4, in B
count+=1
UnboundLocalError: local variable 'count' referenced before assignment
>>> def A():
count=0
def B():
nonlocal count
count+=1
return count
return B
>>> A()()
1
5.lambda 匿名函数:
>>> def A(x):
return 2*x+1
>>> A(5)
11
>>> lambda x,y: x*y+1
<function <lambda> at 0x0000016CCEB85D90>
>>> g=lambda x,y: x*y+1
>>> g(3,4)
13
6.filter()过滤器,过滤结果为True或者1的值:
>>> list(filter(lambda x: x%2,range(10)))
[1, 3, 5, 7, 9]
7.map()映射:将每个数进行相应的操作后,存回序列
>>> list(map(lambda x : x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
8.设置递归梯度:
>>> import sys
>>> sys.setrecursionlimit(梯度)
二、汉诺塔问题
def hanoi(n,x,y,z):
if n==1:
print(x,'-->',z)
else:
hanoi(n-1,x,z,y)#将前n-1哥盘子从x移动到y上
print(x,'-->',z)#将最底下的盘子从x移动到z上
hanoi(n-1,y,x,z)#将y上的n-1哥盘子移动到z上
n=int(input('请输入汉诺塔的层数:'))
hanoi(n,'X','Y','Z')