python递归和二分法
Posted 雾霾1024
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python递归和二分法相关的知识,希望对你有一定的参考价值。
一.递归
1.递归就是自己调用自己
def fn(): fn() fn() #递归深度官方1000 一般都递归到998
2.树形结构的遍历
import os def fn(lujing, n): lst = os.listdir(lujing) # 打开文件夹,列出文件内所有文件名 for i in lst: # 一个一个拿到文件名字 path = os.path.join(lujing, i) # 还原文件路径 if os.path.isdir(path): # 判断是不是文件夹 print(" " * n, i) fn(path, n + 1) # 递归,再一次遍历文件夹内的文件 else: print(" " * n, i) fn("f:/", 0)
3.递归的入口(参数) 和 出口(return)
找准入口和出口
二.二分法
掐头去尾取中间
查找效率非常的高
1.普通的二分法
lst = [1,3,5,7,12,36,68,79] num = int(input("请输入你要查找的数:")) left = 0 right = len(lst) - 1 # 索引就是长度-1 while left <= right: mid = (left + right) // 2 # 取中间的数的索引 if lst[mid] > num: #当num小于中间值的时候就把右边的截掉 right = mid - 1 elif lst[mid] < num: # 当num大于中间值的时候就把左边的截掉 left = mid + 1 else: print("找到了") break else: print("没找到")
2.递归二分法
def fn(n, lst, left, right): while left <= right: mid = (left + right) // 2 if lst[mid] > n: right = mid - 1 return fn(n,lst,left ,right) # 递归如果有返回值,所有调用的地方必须写return elif lst[mid] < n: left = mid + 1 return fn(n,lst,left, right) else: print("找到了") return mid else: print("没有找到") return -1 n = int(input("请输入你要查找的数:")) print(fn(n, lst,0, len(lst)-1))
三.拓展:
最快的查找法(在python中比较麻烦,其他语言快,思想可取)
lst = [1,3,55,98,37,41,2,5,1,4] new_list = [] for i in range(max(lst)+1): #找到数据中的最大值并取到最大值个数+1的索引 因为有0 new_list.append(i) new_list[i] = 0 # 意思是弄最大值+1个空格子 for c in lst: new_list[c] = 1 # 把自身的值 放在对应索引的格子里 n = int(input("请输入你要查找的数:")) if new_list[n] == 1: #格子里有东西就是找到了 print("找到了") else: print("没有找到")
以上是关于python递归和二分法的主要内容,如果未能解决你的问题,请参考以下文章