Python之函数的递归和二分法

一、函数的递归和二分法

1、什么是函数的递归调用?

# 函数的递归调用:就是在调用一个函数的过程中又直接或间接的调用自己。

# 示例1:直接调用自己
def foo()print('hello')
    foo()
    
>>> hello
>>>...
>>>RecursionError: maximum recursion depth exceeded while calling a Python object
    
    
    
# 示例2:间接调用自己
def bar():
    print('from bar')
    foo()
    
def foo():
    print('hello')
    bar()
    
foo()

>>>hello
>>>from bar
>>>....
>>>RecursionError: maximum recursion depth exceeded while calling a Python object


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

import sys
print(sys.getrecursionlimit())  # 查询python设定的最大递归层数
>>> 1000  # 最大的递归层数为1000,超出1000的报错


print(sys.setrecursionlimit(2000))  # 修改最大的递归层数
print(sys.getrecursionlimit())
>>> 2000  # 最打的递归层数修改为2000

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

2、递归调用应该分为两个阶段

# 1、回溯(挖井):一层一层地递归调用下去

# 2、递推(从井里往外跳):在满足某一条件的情况下结束回溯,然后开始向上一层层返回
# 示例1:

# salary(5) = salary(4) + 10  # salary(5) = 48+10
# salary(4) = salary(3) + 10  # salary(4) = 38+10
# salary(3) = salary(2) + 10  # salary(3) = 28+10
# salary(2) = salary(1) + 10  # salary(2) = 18+10
# salary(1) = 18

# 思考:
# 当n=1时   salary(n) = 18
# 当n!=1时  salary(n) = salary(n-1) + 10

def salary(n):
    if n == 1:
        return 18  # 当n=1时返回18
    return salary(n-1) + 10  

res=salary(5)
print(res)
# 示例2:

nums=[111,[222, 333,[444,[555,[666,[777,[888,[999]]]]]]]]


def func(l):
    for x in l:
        if type(x) is list:
            # 把自身的代码重新再调用一次
            func(x)
        else:
            print(x)
func(nums)

3、二分法

# 想从一个按照从小到大排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模

# 示例3:

# 从小到大排列的一个数字列表

nums = [11,22,33,44,55,66,77,88,99,100,101,111,121]

def search(l,find_num):
	print(l)  # 查看找出数字的过程
	if len(l) == 0:  # 如果查到最后列表中字符=0:
		print('find num not exists')
		return
	mid_index = len(l) // 2
	if find_num > l[mid_index]:
		right_l = l[mid_index + 1:]
		search(right_l,find_num)
	elif find_num < l[mid_index]:
		left_l = l[:mid_index]
		search(left_l,find_num)
	else:
		print('find it')

search(nums,88)  # find it


猜你喜欢

转载自blog.csdn.net/weixin_48283789/article/details/107539102