递归函数和二分查找

递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身, 这个函数就是递归函数。

举个例子,我们来计算阶乘 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) 用递归的方式写出来就是:

def fact(n):

    if n == 1:        return 1    return n*fact(n-1)

上面就是一个递归函数.可以试试:

>>> fact(1)
1
>>> fact(5)
120
>>> fact(100)
9332621544394415268169923885626670049071596826438162146859296389521759999322991560894146397615651828625369792082722375825118521

递归函数的优点:

定义简单,逻辑清晰。理论上,所有的函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

递归次数的设置:

默认的递归次数:998

递归到一定的次数就会停止

import sys

sys.setrecursionlimit(10000)

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

可以看到这里的数据加载到8662的时候堆栈溢出,当然还有一个问题,那就是程序直接退出,俗称----掉了。和死循环有点相像。

二分查找法

假如有这样一个列表,让你找到其中的66,你会怎么做呢?

再假如,不用index来找数据呢,假如数据有几十万上百万呢,该怎么处理呢?

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]

这就是一个简单的二分查找法。那么看出什么端倪了吗?

其实就是: 我有这么长的一个列表,加入我从中切一刀,一分为二,66在哪个区间我们就处理哪个区间。这样我想起了初中的一道数学题,一张纸0.01毫米,对折多少次能和珠穆朗玛峰一样高

结果就是 0.01*2**20 = 10485.76

这个和二分法有异曲同工之妙,唯一与之不同的便是二分法是切,折纸是合,不管多么庞大的数据我们都可以用二分法来处理,最终把它变成一个简单的数据。

l1 = [2, 3, 5, 10, 15, 16, 18, 19]def two_find(l1,aim,start = 0,end = None):    end = len(l1)-1 if end is None else end      #三元表达式    mid_index = (end - start) // 2 + start‘‘‘第一次: aim:15 start: 0  end: 6  min_index: 3  中间值:10  aim > 10第二次: aim:15 start: 4  end: 6  min_index: 5  中间值:16  aim < 16第三次: aim:15 start: 4  end: 5  min_index: 4  中间值:15  aim = 15‘‘‘    if start <= end:        if aim > l1[mid_index]:            return two_find(l1,aim,start = mid_index + 1,end = end)        elif aim < l1[mid_index]:            return two_find(l1,aim,start = start,end = mid_index)        elif aim == l1[mid_index]:            return mid_index        else:            return None    else:        return Noneprint(two_find(l1,15))
 
   

原文地址:https://www.cnblogs.com/ALADL/p/9215227.html

时间: 2024-10-25 13:58:50

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

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

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

递归函数之二分查找

一.递归 首先引入一个例子 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 老和尚讲故事 在一个函数里再调用这个函数本身,其最大层数限制是997,最大层数限制是python默认的 结束递归的标志是:return 修改递归最大深度的手段(一般情况下还是别修改比较好) import sys sys.setrecursionlimit(1000

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

递归函数,二分查找

一.递归的定义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为了杜绝此类现象,强制

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

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