零基础学Python注意事项(八)——函数递归和汉诺塔问题

一、在讲汉诺塔问题之前先普及几个细节问题:(汉诺塔问题在最后)

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')
发布了32 篇原创文章 · 获赞 17 · 访问量 4921

猜你喜欢

转载自blog.csdn.net/mango_ZZY/article/details/97624774
今日推荐