递归

递归调用:在函数调用过程中,直接或间接的调用了函数本身,这就是函数的递归调用 
1、必须有一个明确的结束条件,当满足条件时结束递推,进行回溯
2、每次进入更深一层递归时,问题规模相比上次递归都应该有所减少
3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时通过栈stack这种数据结构实现的,
  每当进入一个函数调用,栈就会增加一层栈帧,每当函数返回,栈就会减少一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

4、简单运用:
def f1():
    print('from f1')
    f1()

f1()   #超出设置的递归次数:RecursionError: maximum recursion depth exceeded while calling a Python object

5、查看及设置递归次数

import sys
print(sys.getrecursionlimit())   #1000  查询出设置的最多可以递归多少层
sys.setrecursionlimit(10000)    #
print(sys.getrecursionlimit())   #10000

6、递推年龄

#有几个人,最小的18岁,每个人都比上一个人大2岁,用递归的方法得到第n个人的年龄
def age(n):
    if n == 1:
        return 18
    return age(n-1)+2

print(age(5))    #26

7、二分法运用:

l = [1,3,5,7,9,14,16,17,22,55,66,77,88,99,101,200]
def search(find_num,seq):
    if len(seq) == 0:#判断是否为空列表,如果不判断,后面切到最后就是一个空列表,IndexError: list index out of range
        print('not find')
        return
    mid_index = len(seq)//2  #地板除,得到整数,1//2=0 ,3//2=1 ,2//2 =1
    mid_num = seq[mid_index]
    if find_num > mid_num:
        seq = seq[mid_index+1:]
        search(find_num,seq)
    elif find_num < mid_num:
        seq = seq[:mid_index]
        search(find_num,seq)
    else:
        print('find it')

search(87,l)

  


原文地址:https://www.cnblogs.com/wangkc/p/6935520.html