码迷,mamicode.com
首页 > 编程语言 > 详细

python递归函数及二分法查找

时间:2018-12-30 16:18:01      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:效率   col   def   listdir   python   error   calling   put   fun   

函数的递归: 在一个函数的内部调用自己

死循环: 可以无限循环,不会停止
while True:
    print(我不是递归)
 
递归: 不是死循环,有最大循环深度
def story():
    print(我是递归)
    story()
story()
超过了递归的最大深度报错
RecursionError: maximum recursion depth exceeded while calling a Python object

官网上 源码中设置的递归深度: 1000
自己实际测试递归深度: 998

n = 0
def func():
    global n
    n += 1
    print(n)
    func()
func()
import sys
print(sys.getrecursionlimit())    #查看递归的最大深度

如果你的递归每次都要超过限制 不适合用递归来解决
为什么要有限制? 内存消耗的保护机制
设置递归的最大深度
import sys
sys.setrecursionlimit(1000000)

n = 0
def func():
    global n
    n += 1
    print(n)
    func()
func()

总结
1.递归函数的定义 :一个函数在执行的过程中调用了自己
2.递归在python中的最大深度 : 1000/998
3.递归的最大深度是可以自己修改的,但是不建议你修改

案例(遍历树形结构)
import os
def func(lujing,n):
    lst = os.listdir(lujing)    #打开文件夹,列出该文件夹中的所有文件及目录
    for i in lst:               #循环文件夹中的所有名字,i相当于文件名
        path = os.path.join(lujing,i)   #拼接循环的文件名路径
        # print(path)
        if os.path.isdir(path): #判断拼接后的路径是否是目录
            print(\t*n,i)       #如果是目录就打印,n等于几就是几个tab键分隔
            func(path,n+1)          #然后再次调用自己,在重复上面的操作,
        else:
            print(\t*n,i)       #如果不是目录,就打印文件名
func(E:/test/,0)  #0为分层间隔

二分法查找主要的作用就是查找元素
数据规则: 掐头结尾取中间,必须是有序序列,数据量越大,效率约明显(百万级数据集)

lst = [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(len(lst))
n = int(input(<<<<:))
start = 0
end = len(lst) -1
count = 0
while start <= end:
    mid = (start + end) // 2
    count+= 1
    if n > lst[mid]:
        start = mid +1
    elif n < lst[mid]:
        end = mid -1
    else:
        print(存在)
        break
else:
    print(不存在)
print(查找了%s次%count)

方法2
lst = [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 func(n,lst):
    start = 0
    end = len(lst) -1
    # count = 0
    if lst != []:
        mid = (start + end) //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(<<<:))
func(n,lst)

方法3
lst = [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 func(n,lst,start,end):
    if start <= end:
        mid = (start + end) //2
        if n > lst[mid]:
            start = mid + 1
            return func(n,lst,start,end)
        elif n < lst[mid]:
            end = mid - 1
            return func(n,lst,start,end)
        else:
            print(找到了)
            return mid
    else:
        print(找不到)
        return -1
n = int(input(<<:))
ret = func(n,lst,0,len(lst)-1)
print(ret)

#最快的查找
lst = [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]
new_lst = []
for i in range(88):
    new_lst.append(0)
for i in lst:
    new_lst[i] = 1
print(new_lst)
i = int(input(<<<:))
if new_lst[i] == 0:
    print(存在)
else:
    print(不存在)

 

python递归函数及二分法查找

标签:效率   col   def   listdir   python   error   calling   put   fun   

原文地址:https://www.cnblogs.com/wangm-0824/p/10199565.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!