递归函数

递归函数
mport sys #所有和python相关的设置和方法
sys.setrecursionlimit(10000000)
n = 0
def f():
    global n
    n += 1
    print(n)
    f()

f()
View Code

def story():
    print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?")
while True:
   story()
老和尚讲故事
递归:
在一个函数里调用自己
python递归最大层数限制 997
最大层数限制是python默认的,可以做修改
但是不建议你修改
递归实例:
def age(n):
    if n == 1:
        return 40
    else:
        ret = age(n-1)
        return ret + 2
age(5)
算年龄
结束递归的标志:return
递归三级菜单:
menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}

def threeLM(menu):
    for key in menu:
        print(key)
    k = input(">>>")
    if k in menu:
        threeLM(menu[k])

threeLM(menu)
三级菜单
递归二分法:
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]
print(l.index(66))
num = 0
for i in l:
    if i == 66:
        print(num)
    num += 1
View Code

l = [2,3,5,10,15,16,18,22,26]
def find(l,aim):              #l:列表 aim:要找的
    mid = len(l)//2          #计算中点
    if l[mid] > aim:         #  判断中间位置的值和目标值的大小关系
        new_l = l[:mid]    #[16,18] = [16,18,22,26][:mid]
        return find(new_l,aim)
    elif l[mid] < aim:     #判断中间位置的值和目标值的大小关系
        new_l = l[mid+1:]
        return find(new_l,aim)
    else:
        return l[mid]
print(find(l,16))
取数
l = [2,3,5,10,15,16,18,22,26]
def find2(l,aim,start,end):#[2,3,5,10,15,16,18,22,26]  0,8
    mid = (end+start)//2  #4   #5+8/2=6  #start =5 end = 5 mid = 5
    if start <  end:
        if l[mid] > aim:  #15  17  #18 17
            end = mid -1  #end =6-1 = 5
            return find2(l,aim,start,end)
        elif l[mid] < aim: #15  17
            start = mid + 1  # start = 5
            return find2(l, aim, start, end)
        else:
            return mid
    else:
        return "找不到"

print(find2(l,18,start=0,end = len(l)-1))
View Code
递归解决的问题
就是通过参数,来控制每一次调用缩小计算的规模
适合的场景
数据的规模在减小,但是解决问题的思路没有改变
结束递归的标志:return
def func(num):
    print(num)
    if num == 1:
        return
    if num %2 == 0:
        num = num //2
    else:
        num = num * 3 + 1
    func(num)

func(5)
如果一个数 可以整除2 就整除 不能整除就*3+1


 

 


原文地址:https://www.cnblogs.com/mengqingjian/p/7274674.html