首页 > 代码库 > python - 算法基础 - 递归

python - 算法基础 - 递归

递归在需要重复操作且操作范围呈规律性变化时可以很方便帮我们解决问题

递归的特点:
  1、递归就是在函数中调用自身
  2、在使用递归时,必须有一个明确的结束条件,成为递归出口
  3、递归算法通常显的很简洁,但是效率较低,所以一般不提倡用递归算法设计程序
  4、在递归调用的过程中,系统为每一层的返回点、局部变量等开辟了栈来存储,递归次数过多容易造成栈溢出等

使用递归的要求:
  1、每次相对前一次复杂度(一般是操作范围)都有所减小(通常是减半)
  2、相邻两次重复之间有密切关系,前一次要为后一次做准备(通常是前一次的输出作为后一次的输入)
  3、在问题复杂度极小时,要给出确切的解答(递归结束条件),进而不再进行递归调用

看下面例子:

1 def calc(n):
2     print(n)
3     if n/2 >1:
4         res = calc(n/2)
5         print("看我何时打印以及打印次数:",res)
6     print("看n的值的变化:",n)
7     return n
8 
9 calc(20)
20
10.0
5.0
2.5
1.25
看n的值的变化: 1.25
看我何时打印以及打印次数: 1.25
看n的值的变化: 2.5
看我何时打印以及打印次数: 2.5
看n的值的变化: 5.0
看我何时打印以及打印次数:  5.0
看n的值的变化: 10.0
看我何时打印以及打印次数: 10.0
看n的值的变化: 20

根据上面的结果可以看出递归执行时的顺序

 

用递归算法实现斐波那契数列:

  菲波那切数列原理:数列中(n>=3)后一个数等于前两个数的和

 1 >>> 
 2 >>> def get_fbnq(arg1,arg2,stop):
 3     ‘‘‘打印菲波那切数列片段,上限为stop‘‘‘
 4     if arg1 == 0:
 5         print(arg1,arg2)
 6     arg3 = arg1 + arg2
 7     if arg3 < stop:
 8         print(arg3)
 9         get_fbnq(arg2,arg3,stop)
10 
11         
12 >>> get_fbnq(0,1,600)
13 0 1
14 1
15 2
16 3
17 5
18 8
19 13
20 21
21 34
22 55
23 89
24 144
25 233
26 377
27 >>> 

 

python - 算法基础 - 递归