递归函数和二分法查找

# 递归函数
def func():
    print('hello')
    func()
func()
# 递归深度,你可以自己调用自己的次数,官方文档中递归最大深度是1000.在这之前就会给你报错

 递归很好内存,能用循环就用循环

# 遍历 E:/视频 文件夹,打印出所有的文件和普通文件的文件名
import os
def func(filepath,n):
    # 1.打开这个文件夹
    files = os.listdir(filepath)
    # 2.拿到每一个文件名
    for file in files:  # 文件名
        # 3.获取路径
        f_d = os.path.join(filepath,file)  # E:/视频/文件名
        # 4.判断是否是文件夹
        if os.path.isdir(f_d):
            # 5.如果是文件夹,继续再来一遍
                print('\t'*n,file,':') # 打印文件名
                func(f_d, n+1)
        else:
            print('\t'*n,file)

func('E:/视频',0)

 

使用二分法查找可以提高效率,前提条件:有序序列

核心:掐头去尾取中间,一次砍一半

两种算法:常规循环,递归循环

 

lst = [22,33,44,55,66,77,88,99,101,238,345,456,678,789]
n =79
left = 0
right = len(lst) - 1
while left <= right:  # 边界,当右边比左边还小的时候退出循环
    mid = (left+right)//2  # 必须是整除,因为索引没有小数
    if lst[mid] > n:
        right = mid -1
    if lst[mid] < n:
        left = mid +1
    if lst[mid] == n:
        print('找到了这个数')
        break
else:
    print('没有这个数')

 

递归来完成二分法

lst = [22,33,44,55,66,77,88,99,101,238,345,456,678,789]
def func(n,left,right):
    if left <= right: # 边界
        mid = (left+right)//2
        if n>lst[mid]:
            left=mid+1
            return func(n,left,right) # 递归
        if n<lst[mid]:
            right = mid -1
            return func(n,left,right) # 递归
        elif n == lst[mid]:
            print('找到了')
            return mid  # 递归出口
    else:
        print('没有这个数')
        return -1    # 递归出口

ret = func(66,0,len(lst)-1)
print(ret)

 

# 时间复杂度和空间复杂度降到最低
lst1 = [3,4,5]
lst2 = [0,0,0,0,0,0]
for el in lst1:
    lst2[el] = 1

print(lst2[2] == 1)

 

转载于:https://www.cnblogs.com/Little-Raccoon/p/10844284.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值