Python 学习笔记 17 初识弟归,初识算法,二分查找

一、复习

# 迭代器
# 生成器进阶


# 内置函数
# 55个
# 带key的max min filter map sorted
# 思维导图上红色和黄色方法必须会用、

# 匿名函数
# lambda 参数,参数2:返回值表达式
# 和五个特殊的内置函数可以结合使用

二、初识递归
# 递归函数
# 了解什么是递归:在函数中调用自身函数
# 最大递归深度默认是997/998---是python从内存角度出发做的限制(可修改)
# 能看懂递归
# 能知道递归的应用场景
# 初识递归--
# 算法----二分查找算法
# 三级菜单 ---递归实现

# while True:
# print('从前有座山')

# def story():
# print('从前有座山')
# story()
#
# story()

# RecursionError: maximum recursion depth exceeded while calling a Python object
# 递归错误:超过了递归的最大深度

# import sys
# sys.setrecursionlimit(100000000)
# n = 0
# def story():
# global n
#
# print(n)
# n += 1
# story()
# story()


# 如果递归次数太多,就不适合使用递归来解决问题
# 递归的缺点:占内存
# 递归的优点:会让太码变简单

# alex 多大?
# alex 比egon大两岁
# egon多大?
# egon比wusir大两岁
# wusir多大?
# wusir比金老板大两岁
# 金老板多大?
# 金老板40了

# def age(n):
# if n == 4 :
# return 40
# elif n > 0 and n < 4:
# return age(n+1) + 2
#
# print(age(1)) # 下面返回了46

# 教你看递归

# def age(1): # n = 1 时
# if 1 == 4 : # 不走这个
# return 40
# elif 1 > 0 and 1 < 4: # n = 1 为真,走这个
# return age(1+1) + 2 # 调用age(n+1) 等于调用age(2) 下面返回了44 就是return 44 + 2

# def age(2): #由上个执行得到 n = 2
# if 2 == 4 : # 不走这个
# return 40
# elif 2 > 0 and 2 < 4: # n = 2 为真走这个
# return age(2+1) + 2 # 此时执行age(n+1) 就是age(3) 下面返回了42 就是return 42 + 2

# def age(3): # 由上得 n = 3
# if 3 == 4 : # 此时还不走这个
# return 40
# elif 3 > 0 and 3 < 4: # n = 3 为真 走这个
# return age(3+1) + 2 # 此时还是调用age(n+1) 就是age(4) 返回了40 就是 return 40 + 2

# def age(4): # 由上得n = 4
# if 4 == 4: # n = 4 为真 走这个
# return 40 # 返回给n = 40
# elif 4 > 0 and 4 < 4: # 为假不走了
# return age(n + 1) + 2

三、算法,二分查找法
# 什么叫算法
# 计算的方法:人脑复杂 计算机简单

# 99 * 13 = 1287 = 13 * 100 - 13
# 查找:找数据
# 排序:
# 最短路径

# 我们学习的算法 都是过去时
# 了解基础的算法 才能创造出更好的算法
# 不是所有的事情都能套用现成的方法解决的
# 有些时候会用到学过的算法知识来解决新的问题

# 二分查找算法 必须处理有序的列表 很重要要有序的
# 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))
# 代码实现:
# def find(l,aim):
# mid_index = len(l) // 2
# if l[mid_index] <aim:
# new_l = l[mid_index+1:]
# find(new_l,aim)
# elif l[mid_index] > aim:
# new_l = l[:mid_index]
# find(new_l,aim)
# else:
# print('找到了',mid_index,l[mid_index])
# find(l,66)
# 找到了 0 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 find(l,aim,start = 0,end=len(l)):
# mid_index = (end - start)//2 +start # 计算中间值
# if l[mid_index] < aim:
# find(l,aim,start=mid_index+1,end=end)
# elif l[mid_index] > aim:
# find(l,aim,start=start,end=mid_index-1)
# else:
# print('找到了',mid_index,l[mid_index])
#
# find(l,66)

# 问题点?
# 1.参数 end
# 2.返回值
# 3.找不到的话怎么办

# 先解决参数end问题:
# def find(l,aim,start = 0,end=None):
# end = len(l) if end is None else end
# mid_index = (end - start)//2 +start # 计算中间值
# if l[mid_index] < aim:
# find(l,aim,start=mid_index+1,end=end)
# elif l[mid_index] > aim:
# find(l,aim,start=start,end=mid_index-1)
# else:
# print('找到了',mid_index,l[mid_index])
#
# find(l,66)

# 找不到怎么办?

# def find(l,aim,start = 0,end=None):
# end = len(l) if end is None else end # 24
# mid_index = (end - start)//2 +start # 12
# if l[mid_index] < aim: # l[12] < 44 相当于 12<44
# find(l,aim,start=mid_index+1,end=end) # find(l,44,13,24)
# elif l[mid_index] > aim:
# find(l,aim,start=start,end=mid_index-1)
# else:
# print('找到了',mid_index,l[mid_index])
#
# def find(l,aim,start = 0,end=None): # find(l,44,13,24)
# end = len(l) if end is None else end # 24
# mid_index = (end - start)//2 +start # (24 - 13)//2 + 13 = 18
# if l[mid_index] < aim:
# find(l,aim,start=mid_index+1,end=end)
# elif l[mid_index] > aim: # l[18] < 44 相当于 67>44
# find(l,aim,start=start,end=mid_index-1) # find(l,44,13,18-1)
# else:
# print('找到了',mid_index,l[mid_index])
#
# def find(l,aim,start = 0,end=None): # find(l,44,13,17)
# end = len(l) if end is None else end # 17
# mid_index = (end - start)//2 +start # (17 - 13)//2 + 13 = 15
# if l[mid_index] < aim:
# find(l,aim,start=mid_index+1,end=end)
# elif l[mid_index] > aim: # l[15] < 44 相当于 55>44
# find(l,aim,start=start,end=mid_index-1) # find(l,44,13,15-1)
# else:
# print('找到了',mid_index,l[mid_index])
#
# def find(l,aim,start = 0,end=None): # find(l,44,13,14)
# end = len(l) if end is None else end # 14
# mid_index = (end - start)//2 +start # (14 - 13)//2 + 13 = 13
# if l[mid_index] < aim: # l[13] > 44 相当于 42>44
# find(l,aim,start=mid_index+1,end=end) # find(l,44,13+1,14)
# elif l[mid_index] > aim:
# find(l,aim,start=start,end=mid_index-1)
# else:
# print('找到了',mid_index,l[mid_index])
#
# def find(l,aim,start = 0,end=None): # find(l,44,14,14)
# end = len(l) if end is None else end # 14
# mid_index = (end - start)//2 +start # (14 - 14)//2 + 14 = 14
# if l[mid_index] < aim:
# find(l,aim,start=mid_index+1,end=end)
# elif l[mid_index] > aim: # l[14] < 44 相当于 43<44
# find(l,aim,start=start,end=mid_index-1) # find(l,44,14,14-1)
# else:
# print('找到了',mid_index,l[mid_index])
#
# def find(l,aim,start = 0,end=None): # find(l,44,14,13)
# end = len(l) if end is None else end # 14
# mid_index = (end - start)//2 +start # (13 - 14)//2 + 14 = ? # 此时小的数减大的数一定找不着
# if l[mid_index] < aim:
# find(l,aim,start=mid_index+1,end=end)
# elif l[mid_index] > aim:
# find(l,aim,start=start,end=mid_index-1)
# else:
# print('找到了',mid_index,l[mid_index])

# def find(l,aim,start=0,end=None):
# end = len(l) if end is None else end
# mid_index = (end - start)//2 + start
# if start <= end:
# if l[mid_index] < aim:
# find(l,aim,start=mid_index+1,end=end)
# elif l[mid_index] > aim:
# find(l,aim,start=start,end=mid_index-1)
# else:
# print('找到了',mid_index,l[mid_index])
# else:
# print('%s在序列里找不到'%aim)
#
# find(l,44)

# 返回值
# def find(l,aim,start=0,end=None):
# end = len(l) if end is None else end
# mid_index = (end - start)//2 + start
# if start <= end:
# if l[mid_index] < aim:
# return find(l,aim,start=mid_index+1,end=end)
# elif l[mid_index] > aim:
# return find(l,aim,start=start,end=mid_index-1)
# else:
# return mid_index,l[mid_index]
# else:
# return '%s在序列里找不到'%aim
#
# ret = find(l,44)
# print(ret)


猜你喜欢

转载自www.cnblogs.com/xiuyou/p/11396265.html