python——递归函数

  • 格式:pdf
  • 大小:60.06 KB
  • 文档页数:1

python——递归函数

递归函数

1. 递归函数的定义:函数直接或间接的调⽤函数本⾝,则称该函数为递归函数。也就是说,如果在⼀个函数内部,调⽤⾃⾝本⾝,那么这个函数就称为递归函数。 2. 计算阶乘的算法就⽤到了递归函数,func(n)= n * func(n-1)

1 #定义函数

2 >>> def func(n):

3 if n==1:

4 return 1

5 return n*func(n-1)

6

7 #调⽤函数

8 >>> func(1)

9 1

10 >>> func(5)

11 120

12 >>> func(100)

13 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000 3. 递归函数的优点是逻辑简单清晰,缺点是过深的递归容易导致栈溢出 4. 尾递归:为了解决递归调⽤栈溢出的问题。尾递归是指,在函数返回的时候,调⽤⾃⾝,并且 return 语句中不能包含表达式。 尾递归和循环的效果⼀样,可以把循环看成⼀种特殊的尾递归函数。 ⽤尾递归实现阶乘算法:1 >>> def func(n):

2 return func_iter(n,1)

3

4 >>> def func_iter(num,product):

5 if num==1:

6 return product

7 return func_iter(num-1,num*product) 尾递归调⽤时,如果做了优化,栈不会增长,因此,⽆论多少次调⽤也不会导致栈溢出。 遗憾的是,⼤多数编程语⾔没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上⾯的 func(n)函数改成尾递归⽅式,也会导致栈溢出 5.汉诺塔问题:

1 >>> def move(n,a,b,c): #n为圆盘数,a代表初始位圆柱,b代表过渡位圆柱,c代表⽬标位圆柱

2 if n==1:

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

4 else:

5 #将初始位的n-1个圆盘移动到过渡位,此时初始位为a,上⼀级函数的过渡位b即为本级的⽬标位,上级的⽬标位c为本级的过渡位

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

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

8 #将过渡位的n-1个圆盘移动到⽬标位,此时初始位为b,上⼀级函数的⽬标位c即为本级的⽬标位,上级的初始位a为本级的过渡位

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

10

11

12 >>> move(3,'A','B','C')

13 A --> C

14 A --> B

15 C --> B

16 A --> C

17 B --> A

18 B --> C

19 A --> C