Fork me on GitHub

函数的递归调用

一:引入

函数的递归调用:就是在调用一个函数的过程中又直接或间接地调用了自己
示例1:直接调用自己

def foo():
    print('hello')
    foo()
foo()

示例2:间接的调用自己

def foo():
    print('from foo')
    bar()

def bar():
    print('from bar')
    foo()

bar()

为何死递归会抛出异常?
因为无限的递归会导致内存的溢出,所以python设定了最大的递归层数

import sys
print(sys.getrecursionlimit()) #默认1000层
print(sys.getrecursionlimit(2000)) #可以进行更改

所以:不应该无限递归调用下去,应该在满足某种条件下结束递归调用,然后返回

二:递归调用应该分为两个阶段

1.回溯(挖井) :一层一层地递归调用下去
2.递推(从井里往外爬) :在满足某一条件的情况下结束回溯,然后开始向上一层层返回
示范一:

salary(5)=salary(4)+10
salary(4)=salary(3)+10
salary(3)=salary(2)+10
salary(2)=salary(1)+10
salary(1)=18

n=1   salary(n) = 18
n!=1  salary(n) = salary(n-1) + 10

def saraly(n):
    if n==1:
        return 18
    return saraly(n-1)+10
print(saraly(5))

示范二:

nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]]
def func(num):
    for i in num:
        if type(i) is list:
            func(i)
        else:
            print(i)
func(nums)

从小到大排列的一个数字列表(二分法)

nums = [11, 13, 32, 47, 53, 73, 84, 91, 101, 111, 222, 333, 444, 5555]

def func(num,lis):
    if len(lis)==0:
        print('没找到')
        return
    print(lis)
    res=len(lis) // 2
    mid_num = lis[res]
    if num>mid_num:
        right_l=lis[res+1:] 切分
        func(num,right_l)
    elif num<mid_num:
            left_l=lis[ :res]
            func(num,left_l)
    else:
        print('找到了')
func(0,nums) #没找到,最后会二分出一个空括号,由此判断找不到
posted @ 2020-09-01 10:32  artherwan  阅读(304)  评论(0编辑  收藏  举报