python 递归和二分法
Posted small_caier
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 递归和二分法相关的知识,希望对你有一定的参考价值。
一 内置函数
1. revserd 翻转,返回的是迭代器
# 将 s 倒置 s = ‘不是上海自来水来自海上‘ # 方法一 print(s[::-1]) # 方法二 s1 = reversed(s) i = ‘‘ for el in s1: i +=el print(i)
2.slice 切片
lis = [‘nishi‘,‘woshi‘,‘shuia‘,‘benjim‘] s = slice(1,3) print(lis[s])
3.formate
# 格式化输出 s = "我叫{name},我想去{adress},我喜欢{hobby}.".format(name=‘zhangmeng‘,adress=‘上海‘,hobby=‘dance‘) print(s) # 字符串 print(format(‘test‘, ‘<20‘)) # 左对齐 print(format(‘test‘, ‘>20‘)) # 右对齐 print(format(‘test‘, ‘^20‘)) # 居中 # 数值 print(format(3, ‘b‘)) # 二进制 print(format(97, ‘c‘)) # 转换成unicode字符 print(format(11, ‘d‘)) # 十进制 print(format(11, ‘o‘)) # 八进制 print(format(11, ‘x‘)) # 十六进制(小写字母) print(format(11, ‘X‘)) # 十六进制(大写字母) print(format(11, ‘n‘)) # 和d一样 print(format(11)) # 和d一样 # 浮点数 print(format(123456789, ‘e‘)) # 科学计数法. 默认保留6位小数 print(format(123456789, ‘0.2e‘)) # 科学计数法. 保留2位小数(小写) print(format(123456789, ‘0.2E‘)) # 科学计数法. 保留2位小数(大写) print(format(1.23456789, ‘f‘)) # 小数点计数法. 保留6位小数 print(format(1.23456789, ‘0.2f‘)) # 小数点计数法. 保留2位小数 print(format(1.23456789, ‘0.10f‘)) # 小数点计数法. 保留10位小数 print(format(1.23456789e+10000, ‘F‘)) # 小数点计数法.
4. type() 返回类型 ord() 输入字符找字符编码的位置 chr() 输入位置找出对应的字符 ascii()判断给出的信息是否是ascii
for i in range(65536): print(chr(i), end="")
二. 递归
函数自己调用自己,递归的入口(参数) 和 出口(return)
语法:
def func(): print(‘我是递归‘) func() func() # 官方显示最多到1000.但不会跑到1000,实际到998
# 树形结构的遍历 import os def func(lujing, n): lis = os.listdir(lujing) # 打开文件夹,列出文件夹内的所有文件名 for el in lis: # el 为文件的名字 # 还原文件路径 path = os.path.join(lujing,el) if os.path.isdir(path):# 判断路径是否是文件夹 print(‘*‘ * n,el) # 显示文件夹的名字 func(path, n+1) # 再来一次 else: print(‘/t‘*n,el) # 显示文件 func(‘f:/a‘, 0)
import os def func(lujing, n): lis = os.listdir(lujing ) # 打开文件夹,列出文件夹内的所有文件名 for el in lis: # el为文件名 # 还原文件的路径 path = os.path.join(lujing, el) if os.path.isdir(path): # 判断路径是否是文件夹 print(‘*‘* n, el) # 显示文件夹名称 func(path, n+1) # 再来一次 else: with open(path,mode=‘wb‘) as f: # 打开文件,都写入内容 f.write(b‘123456‘) print(‘/t‘*n, el) # 显示文件 func(‘F:/a‘,0)
三. 二分法
掐头结尾取中间,查找效率非常高,二分法查找的主要作用就是查找元素
# 二分法查找 lst = [1,4,6,7,9,21,23,45,67,87,65,43,89] n = int(input(‘请输入一个数:‘)) lst = sorted(lst) # print(lst) left = 0 right = len(lst)-1 while left <= right: mid = (left + right)//2 if n > lst[mid]: left = mid+1 elif n < lst[mid]: right = mid -1 else: print("存在") break else: print(‘不存在‘)
# 递归 切割列表 def func(n,lst): left = 0 right = len(lst)-1 if lst != []: mid = (left+right)//2 if n>lst[mid]: func(n,lst[mid+1:]) elif n < lst[mid]: func(n,lst[:mid]) else: print("找到了") return else: print("没找到") return n = int(input(‘请输入你要查找的数:‘)) lst = [1,4,6,7,9,21,23,45,67,87,65,43,89] func(n,lst)
# 递归2 def func(n,lst,left,right): # 递归找到什么是可变的,什么是不可变的 if left <= right: mid = (left+right)//2 if n > lst[mid]: left = mid+1 return func(n,lst,left,right) elif n < lst[mid]: right = mid - 1 return func(n, lst, left, right) else: print(‘找到了‘) return mid # 难点 else: print(‘找不到‘) return -1 n = int(input(‘请输入你要查找的数:‘)) lst = [13,45,56,67,78,57,89,101] ret = func(n,lst,0,len(lst)-1) print(ret)
# 最快的查找方法 lst = [13,45,56,57,67,78,89,101] # 找出最大的数 new_lst = [] for i in range(99): new_lst.append(0) for i in lst: new_lst[i] = 1 i = int(input(‘请输入你要找的数据:‘)) if new_lst[i] == 0: print(‘不存在‘) else: print(‘存在‘)
以上是关于python 递归和二分法的主要内容,如果未能解决你的问题,请参考以下文章