day5-python之递归与二分法

一、递归的定义

递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用

二、递归分为两个阶段:递推,回溯

age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18

age(n)=age(n-1)+2 #n>1
age(1)=18 #n=1

##########################3
def age(n):
    if n == 1:
        return 18
    return age(n - 1) + 2

print(age(5))

三、python中的递归效率低且没有尾递归优化

#python中的递归
python中的递归效率低,需要在进入下一次递归时保留当前的状态,在其他语言中可以有解决方法:尾递归优化,即在函数的最后一步(而非最后一行)调用自己,尾递归优化:http://egon09.blog.51cto.com/9161406/1842475
但是python又没有尾递归,且对递归层级做了限制

#总结递归的使用:
1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出) 

四、可以修改递归最大深度

import sys
sys.getrecursionlimit()
sys.setrecursionlimit(2000)
n=1
def test():
    global n
    print(n)
    n+=1
    test()

test()

虽然可以设置,但是因为不是尾递归,仍然要保存栈,内存大小一定,不可能无限递归

五:递归应用

应用:把列表所有的内容取出来

l = [1, 2, [3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15, [16, [17, ]], 19]]]]]]]

def search(l):
    for item in l:
        if type(item) is list:
            search(item)
        else:
            print(item)

search(l)

六、二分法

想从一个按照从小到大排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模

1、找某个数字在不在列表里边

l = [1, 2, 5, 7, 10, 31, 44, 47, 56, 99, 102, 130, 240]

+++++++++++++++++++++++++++++++++++
a=len(l) //2
print(a)#6
print(len(l))#13
print(l[6:]) #[44, 47, 56, 99, 102, 130, 240]
print(l[:6]) #[1, 2, 5, 7, 10, 31]
+++++++++++++++++++++++++++++++++++

def binary_search(l, num):
    print(l)  # [10, 31]
    if len(l) > 1:   #如果列表的长度大于一,就执行下面的递归操作
        mid_index = len(l) // 2  # 把列表切分成两半,拿到中间值的索引 44的索引为6
        if num > l[mid_index]:  # 用户要找的值跟中间那个值比较,如果大于中间值,那么这个值在列表右边
            l = l[mid_index:]  # l=[31],切分,去右边找值
            binary_search(l, num)  # 递归一次,规模减少一半
        elif num < l[mid_index]:  # 如果是小于中间值的话,那么这个值就在列表的左边
            l = l[:mid_index]  # 切分
            binary_search(l, num)
        else:
            print(‘find it‘)
    else:
        if l[0] == num:##如果列表中就存在一个值,如果这个值就是我要找的那个值,就直接打印
            print(‘find it‘)
        else:
            print(‘not exist‘)
        return

binary_search(l, 32)

2、找某个数字在不在列表里边优化版

l = [1, 2, 5, 7, 10, 31, 44, 47, 56, 99, 102, 130, 240]

def binary_search(l, num):
    print(l)
    if len(l) == 1:
        if l[0] == num:
            print(‘find it‘)
        else:
            print(‘not exists‘)
        return
    mid_index = len(l) // 2
    mid_value = l[mid_index]
    if num == mid_value:
        print(‘find it‘)
        return
    if num > mid_value:
        l = l[mid_index:]
    if num < mid_value:
        l = l[:mid_index]
    binary_search(l, num)

binary_search(l, 32)

  

  

时间: 2024-10-10 22:54:30

day5-python之递归与二分法的相关文章

python的递归和二分法

递归是什么 递归是一种函数的类型,以类似于首尾相连的贪吃蛇的模式执行. count = 0 def func(): global count count = count + 1 print("我有点小帅%s"%count) func() func() #输出我有点小帅1.........我有点小帅998 注意,上条代码中为什么执行998次呢 我们可以通过sys模块来进行查看默认最大执行次数,同时 sys.setrecursionlimit() 也能进行更改. print(sys.get

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

携程函数、递归、二分法、import、from。。。import

携程函数 与yield类似 yield: 1:把函数的执行结果封装好__iter__和__next__,即得到一个迭代器 2:与return功能类似,都可以返回值,但不同的是,return只能 返回一次值,而yield可以返回多次值 3:函数暂停与再继续运行的状态是有yield保存 def func(count): print('start') while True: yield count count+=1 g=func(10) print(g) print(next(g)) print(ne

三元表达式、递归、二分法、匿名函数、内置函数

三元表达式: def max2(x,y): if x>y: return x else: return y res=max2(10,11) print(res) x=10 y=11 三元表达式仅应用于: 1.条件成立返回一个值 2.条件不成立返回一个值 res=x if x>y else y print(res) def max2(x,y): return x if x>y else y print(max2(10,11)) 函数的递归.二分法 函数递归:函数的递归调用,即在函数调用的过

递归和二分法

递归 定义: 函数的嵌套调用是:函数嵌套函数.函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接地调用了它自身. 如果递归函数不断地调用函数自身,那么这个递归函数将会进入一个死循环,因此我们应该给递归函数一个明确的结束条件. 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,进入下一层递归的问题规模都将会减小 回溯:递归必须要有一个明确的结束条件,在满足该条件开始一层一层回溯. 递归次数 递归的次数为997 ,但可以用操作设置python运行环境的sys

Java递归实现二分法,希望各位指点一下

/* 3.使用二分法查找有序数组中元素.找到返回索引,不存在输出-1.使用递归实现   */   import java.util.Scanner;   public class Recursion{   public static void main(String[]args)   {   System.out.println("请输入要找的整数");   Scanner sc=new Scanner(System.in);   int num = sc.nextInt();   i

关于python最大递归深度 - 998

今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,11,12,13. 代码: class Solution: def __init__(self): self.key = '1' self.result = 0 def countDigitOne(self, n): """ :type n: int :rtype: int &qu

python的递归

今天,我们要讲的内容是关于python的递归. 什么是递归?看这个名字,你也许能够猜出个大概.关于递归,我们有一个很经典的应用,就是我们以前高中一些数学题目中的累乘,像n *(n-1)* (n-2) * ... * 1.在这里,如果要让你计算最终的结果,你可能会想到用for循环来实现,但是,我们在这里可以稍微进行优化一下,比如像这个例子一样: #for循环 def LSF(n): result = n for i in range(1,n): result *= i return result

python学习(递归)

一. 递归 递归就是函数自己调用自己 python中递归最大可用深度是997 递归可以用来遍历各种树形结构 #用递归方法查看某一个路径内的文件内容 import os filepath = 'd:\资料下载' #要打开的文件路径 def read(filepath,n): #n为递归深度,也就是用来控制缩进的数量 it = os.listdir(filepath) #按照给出的文件路径打开文件, 返回的it是一个可迭代对象 # print("__next__"in dir(it)) #

六. python进阶(递归)

一 .递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归函数: 一个会调用自身的函数称为递归函数凡是循环能干的事情 递归都能干方式: 写出临界条件 我这一次和上一次的关系 假设当前函数已经能用 调用自身计算上一次结果 在求出本次的结果 必须有一个明确的结束条件:每次进入更深一层递归时,问题规模相比上次递归都应有所减少相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入).递归效率不高,递归层次过多会导致栈溢出(在计