12. 函数递归与二分法

函数递归

​ 递归是函数嵌套使用的一种特殊情况,本质上就是在调用一个函数的过程中直接或间接的调用其本身

​ 递归的本质就是循环,所以当需要重复执行代码的时候使用递归

# 一、递归的两种形式:
# 1.直接调用本身
def f1():
    print('是我是我还是我,想不到吧')
    f1()
f1()
# 2.间接接调用本身
def f1():
    print('===>f1')
    f2()
def f2():
    print('===>f2')
    f1()
f1()

# 一段代码的循环运行的方案有两种
# 方式一:while、for循环
while True:
    print(1111)
    print(2222)
    print(3333)

# 方式二:递归的本质就是循环:
def f1():
    print(1111)
    print(2222)
    print(3333)
    f1()
f1()

# 二:需要强调的是:
# 递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用(return)
# 一般情况下Python默认的递归层数是1000,也没有尾递归优化
n=0
while n < 10:
    print(n)
    n+=1
def f1(n):
    if n == 10:
        return
    print(n)
    n+=1
    f1(n)
f1(0)

# 三:递归的两个阶段(这里指的是思路)
# 回溯:一层一层调用下去(找到满足条件的时候),从上往下
# 递推:满足某种结束条件,结束递归调用,然后一层一层返回,从下往上
age(5) = age(4) + 10
age(4) = age(3) + 10
age(3) = age(2) + 10
age(2) = age(1) + 10
age(1) = 18
def age(n):
    if n == 1:
        return 18
    return age(n-1) + 10
res=age(5)
print(res)

# 四:递归应用
l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]
def f1(list1):
    for x in list1:
        if type(x) is list:
            # 如果是列表,应该再循环、再判断,即重新运行本身的代码
            f1(x)
        else:
            print(x)
f1(l)

查看设置递归的层数(了解但是不要使用)

import sys
sys.getrecursionlimit()  # 查看递归深度限制
sys.setrecursionlimit(1200)  # 修改递归深度限制

算法之二分法

在一个从小到大排列的数字列表中,寻找某个值的时候

思路:找到列表中间的值——》与你要找的值进行比较,判断在左还是在右——》重复前面的环节——》解决一下其他的问题(要找的值在列表中不存在、就是切片到最后的时候列表为空)

nums=[-3,4,7,10,13,21,43,77,89]  # 数值从小到大排列
find_num=10 # 要找到10
nums=[-3,4,13,10,-2,7,89]
nums.sort()
print(nums)
# 方案一:整体遍历效率太低,当元素数量过多的时候会花费较长的时间
for num in nums:
    if num == find_num:
        print('find it')
        break
# 方案二:二分法
def binary_search(find_num,列表):
    mid_val=找列表中间的值
    if find_num > mid_val:
        # 接下来的查找应该是在列表的右半部分
        列表=列表切片右半部分
        binary_search(find_num,列表)
    elif find_num < mid_val:
        # 接下来的查找应该是在列表的左半部分
        列表=列表切片左半部分
        binary_search(find_num,列表)
    else:
        print('find it')

nums=[-3,4,7,10,13,21,43,77,89]
find_num=8
def binary_search(find_num,l):
    print(l)
    if len(l) == 0:
        print('找的值不存在')
        return
    mid_index=len(l) // 2
    if find_num > l[mid_index]:
        # 接下来的查找应该是在列表的右半部分
        l=l[mid_index+1:]
        binary_search(find_num,l)
    elif find_num < l[mid_index]:
        # 接下来的查找应该是在列表的左半部分
        l=l[:mid_index]
        binary_search(find_num,l)
    else:
        print('find it')
binary_search(find_num,nums)
posted @ 2021-11-05 21:40  奇点^  阅读(58)  评论(0)    收藏  举报