Python之路-day3

递归函数

计算:n!

deffact(n):

ifn==1:

return1

returnn*fact(n-1)

print(fact(6))

但n=6时,输出:

720

可见递归函数的定义非常简单,但使用时很容易发生栈溢出。

deffact(n):

ifn==1:

return1

returnn*fact(n-1)

print(fact(1000))

输出就会报错:

File "C:/Users/苏小爪/20171208.py", line 68, in fact

return n*fact(n-1)

File "C:/Users/苏小爪/20171208.py", line 66, in fact

if n==1:

RecursionError: maximum recursion depth exceeded in comparison

我们通过使用尾递归来解决这个问题:

'''采用尾递归优化'''

deffact(n):

returnfact_tail(n,1)

deffact_tail(num,product):

ifnum ==1:

returnproduct

returnfact_tail(num -1,num * product)

print(fact(6))

输出:720

递归函数用尾递归来解决栈溢出的问题,思路是函数调用函数,并从尾部开始。

练习:

汉诺塔的移动。用递归函数来实现。

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

解题:

设:柱子为a,b,c,圆盘数为n。(n,n-1,n-2......3,2,1),小数在上,大数在下。

'''汉诺塔'''

defmove(a,b,c,n):

ifn==1:

print(a,'-->',c)

else:

move(a,c,b,n-1)

print(a,'-->',c)

move(b,a,c,n-1)

print(move('a','b','c',3))

测试输出:

None

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171214G08M8900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券