函数递归

一、递归

# 递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用

#直接调用本身
def f1():
    print('from f1')
    f1()
f1()

#间接调用本身
def f1():
    print('from f1')
    f2()

def f2():
    print('from f2')
    f1()
f1()

二、递归深度

递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997

997是python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:

import sys
print(sys.setrecursionlimit(100000)

三、递归举例

# 1. 案例一 获得第count个人的年龄
def get_age(count):
    if count == 1:
        return 20
    age = get_age(count - 1) - 2   # age(n) = age(n-1) - 2
    return age
print(get_age(5))                  # 12


# 2. 案例二 求n的阶乘   n! = n * (n - 1)!
def jiecheng(n):
    if n == 1 or n == 0:
        return 1
    ji = jiecheng(n - 1) * n
    return ji
print(jiecheng(5))    # 120

四、二分法

查找 66 

 

# 简易二分法
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

def func(l,aim):
    mid = (len(l)-1)//2
    if l:
        if aim > l[mid]:
            func(l[mid+1:],aim)
        elif aim < l[mid]:
            func(l[:mid],aim)
        elif aim == l[mid]:
            print("bingo",mid)
    else:
        print('找不到')
func(l,66)
func(l,6)
# 升级二分法
def search(num,l,start=None,end=None):
    start = start if start else 0
    end = end if end is not None else len(l) - 1
    mid = (end - start)//2 + start
    if start > end:
        return None
    elif l[mid] > num :
        return search(num,l,start,mid-1)
    elif l[mid] < num:
        return search(num,l,mid+1,end)
    elif l[mid] == num:
        return mid

 

posted on 2020-05-15 23:38  软饭攻城狮  阅读(124)  评论(0编辑  收藏  举报

导航