(💡声明:这里说的内容比较粗浅,是为了方便零基础还有4--6年级同学去理解和入门)基于能够入门了,能有大体的概念以后再去进入深度专业的学习也不迟就像爬楼梯,一步一步的,每一步都建立于前一步的基础避免重复计算,效率高,逻辑清晰 常用来解决数列问题、规律问题(又称黄金分割数列或兔子数列,是一个每一项都等于前两项之和的整数数列 。该数列通常以 0 和 1 开始,后续数字按公式生成,相邻两项比值趋近黄金分割比)1,1,2,3,5,8,这个数列从第3项开始 ,每一项都等于前两项之和,💡解题思路:
- 初始条件:第 1 个数 a=1,第 2 个数 b=1
- a , b = b , a+b (结合数学交换律看待这个赋值过程)
a = 1b = 1# 输出前两个数print(a, b, end=" ")# 循环计算后面8个数,凑够10个for i in range(8): # 递推:下一个数 = 前两个数的和 c = a + b print(c, end=" ") # 重新赋值,为下一次计算做准备 a, b = b, c # 数学的交换律
主要就是把复杂的大问题拆解成一个个小问题,先解决每一个小问题⚠️注意点:递归必须有明确的递归出口,否则无限循环,程序会报错的题目
求 n 的阶乘,n! = 1×2×3×…×n,比如 5! = 5×4×3×2×1 = 120。
💡解题思路:
- 递归公式:n! = n × (n-1)! (大问题拆分成小问题)
- 递归出口:当 n=1 时,1! = 1(最小问题有明确答案)
# 定义函数def f(n): # 递归出口:n=1时,阶乘是1 if n == 1: return 1 # 递归调用:n! = n * (n-1)! return n * f(n-1)# 调用函数,求5的阶乘print(f"5的阶乘是:{f(5)}")
在一堆数据里,按照固定的规则,查找目标元素,直到找到目标、或者找完所有数据很类似在图书馆找书,按照图书馆的类目标签(图书摆放规则),去找寻自己需要的书籍(目标书籍)题目
在一个班级的成绩列表里,查找有没有考 100 分的同学,如果有,输出他的位置;如果没有,输出 “没有满分同学”。
💡解题思路:
# 成绩列表s= [85, 92, 100, 78, 96, 100, 88]# 目标分数n = 100# 标记是否找到m = False# 线性搜索for x,y in enumerate(s): if y == n: print(f"找到满分同学,位置是第{x}个") m = True# 没找到的情况if not m: print("没有满分同学")
题目
在一个从小到大排好序的成绩列表里,快速查找有没有 88 分的同学
💡解题思路:
二分查找也叫折半查找,每次取列表中间的数和目标对比:
- 中间数 < 目标,目标在右边,只找右半部分每次排除一半的数据
# 排好序的成绩列表s = [60, 72, 78, 85, 88, 92, 96, 100]# 目标分数n = 88# 左右范围left = 0right = len(s) - 1m = False# 二分查找while left <= right: # 确定中间位置 mid = (left + right) // 2 mid_s = s[mid] # 找到目标 if mid_s == n: print(f"找到88分,位置是第{mid}个") m = True break # 中间数大于目标,找左边 elif mid_s> n: right = mid - 1 # 中间数小于目标,找右边 else: left = mid + 1# 没找到的情况if not m: print("没有找到88分的同学")
⚠️ 新手指南(90% 的新手都踩过的坑)
- 枚举算法枚举的范围要精准,范围太大会导致程序运行很慢,范围太小会漏掉正确答案
- 模拟算法一定要 100% 贴合题目规则,漏掉任何一个条件都容易导致结果错误
- 贪心算法不是所有问题都能用贪心,必须确认 “局部最优能得到全局最优”,否则会出错
- 递推算法
- 递归算法必须写明确的递归出口,否则会无限循环,触发栈溢出报错
- 二分查找必须用在有序数据上,无序数据不能用,否则会找不到正确结果
✌️,那么今天关于算法的后半篇内容的笔记,到这里就分享结束了✌️💡如果各位同学有其它有趣经典的题目,也可以评论交流~分享给身边更多学 Python 的小伙伴👬,你们的认可是我的动力,只有更多的兴趣相同的人看见,才会碰撞出不同的思维火花🔥🖥️练习1:用递推算法,求斐波那契数列的第15个数🖥️练习3:用线性搜索,在列表[5,2,9,1,5,6]中找到数字9的位置