递归函数之二分查找

一、递归

首先引入一个例子

def story():
    s = """
    从前有个山,山里有座庙,庙里老和尚讲故事,
    讲的什么呢?
    """
    print(s)
    story()

story()

老和尚讲故事

在一个函数里再调用这个函数本身,其最大层数限制是997,最大层数限制是python默认的

结束递归的标志是:return

修改递归最大深度的手段(一般情况下还是别修改比较好)

import sys
sys.setrecursionlimit(1000000)
n=0
def f():
    global n
    n+=1
    print(n)
    f()
f()

修改递归最大深度

递归解决的问题:

#就是通过参数,来控制每一次调用缩小计算的规模

#适合的场景

#数据的规模在减小,但是解决问题的思路没有改变

练习:

1.猜年龄游戏

#猜e的年龄
#e比d大两岁
#d比c大两岁
#c比b大两岁
#b比a大两岁
#a 40了

# 1.a  age(1) = 40
# 2.b  age(1) + 2
# 3.c   age(2) + 2
# 4.d  age(3) + 2
# 5.e  age(4) + 2

def age(n):
    if n == 1:
        return 40
    else:
        ret = age(n-1)
        return ret + 2
age(5)

猜年龄

2.如果一个数可以整除2,就整除,不能整除(*3+1)

def func(num):
    print(num)
    if num==1:
        return
    if num%2==0:
        num=num//2
    else:
        num=num*3+1
    func(num)
func(5)

不能整除2

3.一个数除2到不能整除2为止

def cal(num):
    if num % 2 == 0:
        num  = num // 2
        return cal(num)
    else:
        return num

print(cal(8))

整除2

递归函数与三级菜单

def threeLM(dic):
    while True:
        for k in dic:print(k)
        key = input(‘input>>‘).strip()
        if key == ‘b‘ or key == ‘q‘:return key
        elif key in dic.keys() and dic[key]:
            ret = threeLM(dic[key])
            if ret == ‘q‘: return ‘q‘
        elif (not dic.get(key)) or (not dic[key]) :
            continue

threeLM(menu)

二、二分查找算法

如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?

l = [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]

二分查找算法

l = [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]

你观察这个列表,这是不是一个从小到大排序的有序列表呀?

如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?

这就是二分查找算法

简单二分法

l = [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(l,aim):
    mid = (len(l)-1)//2
    if l:
        if aim > l[mid]:
            func(l[mid+1:],aim)
        elif aim < l[mid]:
            func(l[:mid],aim)
        elif aim == l[mid]:
            print("bingo",mid)
    else:
        print(‘找不到‘)
func(l,66)
func(l,6)

二分法基础版

简单版

def func(l, aim,start = 0,end = len(l)-1 ):
    mid = (start+end)//2
    if not l[start:end+1]:
        return
    elif aim > l[mid]:
        return func(l,aim,mid+1,end)
    elif aim < l[mid]:
        return func(l,aim,start,mid-1)
    elif aim == l[mid]:
        print("bingo")
        return mid

index = func(l,68)
print(index)

二分法查找升级版

升级版

时间: 2024-11-12 03:45:40

递归函数之二分查找的相关文章

python函数:递归函数及二分查找算法

本文和大家分享的主要是python的递归函数及二分查找算法相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 老和尚讲故事 递归的定义 -- 在一个函数里再调用这个函数本身.这种魔性的使用函数的方式就叫做 递归 . 递归的最大深度:997 1.python递归最大层

day 15,递归函数,二分查找法

一.递归函数 '''1,算法:二分查找,树运算,堆,栈.... '''#前提,有序且唯一的数字数列# l = [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(l.index(66))# count = 0# for i in l:# if i == 66:# print(count)# break# count += 1 #,1,aim 6#2,aim与list的中间的数进行比较mi

递归函数、二分查找、面相对象初识、类空间,对象空间、组合、继承

一.递归函数 一般递归100多次,都没有解决的问题,放弃递归. 默认递归深度:998 修改默认递归次数 import sys sys.setrecursionlimit(100000) #设置十万次 count = 0 def func1(): global count count += 1 print(count) func1() func1() 用递归 解决一个年龄问题. alex 他比佩奇 大两岁.  4   age(3) + 2 佩奇 他比日天 大两岁.  3   age(2) + 2

递归函数和二分查找

递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身, 这个函数就是递归函数. 举个例子,我们来计算阶乘 n! = 1 x 2 x 3 x ... x n,用函数 fact(n) 表示,可以看出: fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n 所以,fact(n)可以表示为n*fact(n-1),只有 n = 1 时需要特殊处理. 于是,fact(n) 用递归的方式写出来就是: d

递归函数,二分查找

一.递归的定义1.什么是递归? 在一个函数里再调用这个函数本身2.最大递归层数做了一个限制:997,但是也可以自己限制 (1)默认递归层数 def foo(n): print(n) n+=1 foo(n) foo(1) (2)修改递归层数 import sys sys.setrecursionlimit(2000) #修改递归层数 n = 0 def f(): global n n += 1 print(n) f() f() 3.斐波那契数列,第10个数是多少?(递归函数写) def f5(de

[经典算法] 二分查找

题目说明: 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,失败返回-1. 题目解析: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它.其算法流程如下: 1.一开始,范围覆盖整个数组. 2

基础算法介绍 —— 二分查找算法

不知不觉在目前的公司待满3年了,打算回家找份工作.面试中被问到关于算法的题目:有哪些常见的查找算法?下来就把我所掌握的查找算法分享给大家,本文主要介绍二分查找算法. 算法定义(摘自百度):二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果

python--递归、二分查找算法

递归 初识递归 递归的定义--在一个函数里再调用这个函数本身 现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归. 刚刚我们就已经写了一个最简单的递归函数. 递归的最大深度--997 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制

算法前戏 递归 二分查找 列表查找

一.递归 概念: 函数直接或者间接的调用自身算法的过程,则该函数称为递归函数.在计算机编写程序中,递归算法对解决一大类问题是十分有效的. 特点: ①递归就是在过程或者函数里调用自身. ②在使用递归策略时,必须有一个明显的结束条件,称为递归出口.问题规模相比上次递归有所减少, ③递归算法解题通常显得很简洁,但递归算法解题的效率较低.所以一般不倡导使用递归算法设计程序. ④在递归调用的过程当中系统的每一层的返回点.局部变量等开辟了栈来存储.递归函数次数过多容易造成栈溢出等. 所以一般不倡导用递归算法