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

一、递归

概念:

  函数直接或者间接的调用自身算法的过程,则该函数称为递归函数。在计算机编写程序中,递归算法对解决一大类问题是十分有效的。

特点:

  ①递归就是在过程或者函数里调用自身

  ②在使用递归策略时,必须有一个明显的结束条件,称为递归出口。问题规模相比上次递归有所减少,

  ③递归算法解题通常显得很简洁,但递归算法解题的效率较低。所以一般不倡导使用递归算法设计程序。

  ④在递归调用的过程当中系统的每一层的返回点、局部变量等开辟了栈来存储。递归函数次数过多容易造成栈溢出等。

  所以一般不倡导用递归算法设计程序。

要求:

递归算法所体现的"重复"一般有三个条件:

  ①每次在调用规模上都有所缩小(通常是减半)。

  ②相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。

  ③在问题的规模极小时必须用直接解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),

无条件的递归调用将会成为死循环而不能正常结束。

分析以下函数的执行过程:

def func3(x):    if x>0:        print(x)        func3(x-1)func3(5)def func4(x):    if x>0:       func4(x-1)       print(x)func4(5)

  根据Python执行的过程,及函数调用去分析执行结果!

 关于斐波拉契数列

  斐波拉契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368。

特别注意:第0项是0,第1项是第一个1。这个数列从第2项开始,每一项都等于前两项之和。

def fibo(n):before = 0after = 1if n == 0 or n == 1:return nif n <= 3:return 1return fibo(n-1)+fibo(n-2)print(fibo(3))
斐波那契数列

二分查找

  从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

特点:

  二分查找算法就是不断将数组进行对半分割,每次拿中间元素和要找的元素进行比较。小就向右找,大就向左找!

要求:  

  在一段数字内,找到中间值,判断要找的值和中间值大小的比较。
    如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找。
    如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找。
  直到找到我们希望的数字。

def search_data(data,data_find):# 中间值的索引号的定义:数组长度/2mid = int(len(data)/2)# 判断从1开始的数字数组内查找if data[mid] >= 1:# 如果我们要找的值(data_find)比中间值(data[mid])小if data[mid] > data_find:print("你要找的数字比中间值[%s]小..." % data[mid])# 在中间值(data[mid])的左侧继续查找,在此函数中继续循环
            search_data(data[:mid],data_find)# 如果我们要找的值(data_find)比中间值(data[mid])大elif data[mid] < data_find:print("你要找的数字比中间值[%s]大..." % data[mid])# 在中间值(data[mid])的右侧继续查找,在此函数中继续循环
            search_data(data[mid:],data_find)else:# 如果我们要找的值(data_find)既不比中间值(data[mid])大,也不比中间值(data[mid])小,则就是它print("这就是你要找的[%s]!" % data[mid])else:print("不好意思,没有找到你要的值...")if __name__ == '__main__':# 创建一个1到6000万的连续数字数组data = list(range(60000000))# 调用函数找到95938的值search_data(data,95938)
相关代码举例

列表查找

列表查找:从列表中查找指定元素
  输入:列表、待查找元素
  输出:元素下标或未查找到元素

一般是有两种方法:

1、顺序查找

  从列表第一个元素开始,顺序进行搜索,直到找到为止。

def linear_search(data_set,value):for i in data_set:if data_set[i] == value:return i

2、二分查找

  从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

def bin_search(data_set,value):low = 0high = len(data_set)-1while low <= high:mid = (low+high)//2if data_set[mid] == value:return midelif data_set[mid] > value:high = mid - 1else:low = mid + 1
def bin_search(data_set,value,low,high):if low <= high:mid = (low+high)//2if data_set[mid] == value:return midelif data_set[mid] >value:return bin_search(data_set,value,low,high)else:return bin_search(data_set, value, low, high)else:return
二分查找递归版

练习题:

现有一个学员信息列表(按id增序排列),格式为:[{"id":1001, "name":"张三", "age":20},{"id":1002, "name":"李四", "age":25},{"id":1004, "name":"王五", "age":23},{"id":1007, "name":"赵六", "age":33}]修改二分查找代码,输入学生id,输出该学生在列表中的下标,并输出完整学生信息。
l = [{"id":1001, "name":"张三", "age":20},{"id":1002, "name":"李四", "age":25},{"id":1004, "name":"王五", "age":23},{"id":1007, "name":"赵六", "age":33}
]def bin_search(data_set,value):"""二分查找:param data_set: 列表:param value: 要查的值:return:"""low = 0high = len(data_set)-1while low <= high:mid = (low+high)//2if data_set[mid]['id'] == value:return (mid,data_set[mid])elif data_set[mid]['id'] > value:high = mid - 1else:low = mid + 1else:return (0,None)flog = True
while flog:sid = input("请输入学号(退出:Q):").strip()if sid.isdigit():if sid.upper() == "Q":flog = Falseelse:sid = int(sid)mid,infos = bin_search(l,sid)if not infos:print("查无此人!!!")else:s = "学生学号:{id},姓名:{name},年龄:{age}".format(**infos)print("该学生所在信息索引坐标:%s"%mid)print("该学生的所有信息:%s"%s)

 

转载于:https://www.cnblogs.com/zh605929205/p/7467231.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nuxt中必须要知道的一点 关于 nuxt-link 和 a 标签的区别

在nuxt项目中可以有两种方式进行路由跳转 1、使用nuxt-link标签 <nuxt-link to"/shop/cart">购物车</nuxt-link>2、使用a标签 <a href"/shop/cart">购物车</a>这两个的区别是 nuxt-link还是在现在的体系中进行加载 a相当于另外打…

android 多选项实现

建集合 private ArrayList<Integer> selectpositionnew ArrayList<>();//Integer可换任何类型 选中就添加入集合 public void onChoose(final int position){selectposition.add(position); } 取消则移除集合 public void onNoChoose(final int position){try {sel…

TCP/IP完整的基础介绍

TCP/IP应该是个协议集&#xff0c;根据OS的七层理论&#xff0c;TCP/IP分为四层&#xff0e;分别是应用&#xff0c;传输&#xff0c;Interne和网络界面&#xff0e; 我们一般说TCP在传输层&#xff0c;而IP在Internet层&#xff0e;TCP/IP的应用程序包括我们平时经常用到的Pin…

使用nuxt

Nuxt.js简单介绍 2016 年 10 月 25 日&#xff0c;zeit.co 背后的团队对外发布了 Next.js&#xff0c;一个 React 的服务端渲染应用框架。几小时后&#xff0c;与 Next.js 异曲同工&#xff0c;一个基于 Vue.js 的服务端渲染应用框架应运而生&#xff0c;我们称之为&#xff1…

配置HAProxy支持https协议

author&#xff1a;JevonWei版权声明&#xff1a;原创作品 实现http重定向到https HAProxy 创建CA证书 [rootHAProxy ~]# cd /etc/haproxy/ [rootHAProxy haproxy]# mkdir certs [rootHAProxy haproxy]# cd /etc/pki/CA [rootHAProxy CA]# (umask 077;openssl genrsa -out priv…

android 万能倒计时,时分秒倒计时

1、工具类 /*** 作者&#xff1a;created by meixi* 邮箱&#xff1a;15913707499163.com* 日期&#xff1a;2018/12/28 15*/public class TimerUtil {private static final int nHandlerMsg 23566124;private int nStartDelayTime;private int nIntervalTime;private Timer …

菜鸟必备的网络命令

对于菜鸟的我来讲很有保存价值开始菜单中的“运行”是通向程序的快捷途径&#xff0c;输入特定的命令后&#xff0c;即可快速的打开Windows的大部分程序&#xff0c;熟练的运用它&#xff0c;将给我们的操作带来诸多便捷。 winver 检查Windows版本 wmimgmt.msc 打开Windows管理…

实现瀑布流的核心代码

.warp {column-count: 2;column-gap: 10px;padding: 5px; }.item {height: 80px;margin-bottom: 10px;break-inside: avoid; }效果如下

Mac OS X Terminal 101:终端使用初级教程以及Xcode

转自 http://www.renfei.org/blog/mac-os-x-terminal-101.html 最近学习苹果认证的《Mac OS X Support Essentials》教程&#xff0c;看到 Command Line 一节有很多实用的知识&#xff0c;下面选取一部分翻译 笔记&#xff0c;整理成此文。 你可以整天驾驶汽车而不用知道如何修…

android studio 获取SHA1值 MD5值

运行CMD 输入 cd .android 回车 输入 keytool -list -v -keystore D:/yohoo.keystore -storepass android 回车 D:/yohoo.keystore------就是你的keystore的位置 &#xff0c; android------- 就是你的keystore的密码 如果提示keytool 不是内部命令或可运行程序。需先配…

修改远程端口

怎么更改远程桌面3389端口号才能使用服务器更加安全?一些黑客常常利用远程服务器桌面的3389端口进行入侵,因此我们有必要学会如何更改远程桌面的端口号来保护自己. 远程终端服务基于端口3389。入侵者一般先扫描主机开放端口&#xff0c;一旦发现其开放了3389端口&#xff0c;就…

MongoDB 常用运算符

$eq (等于) $gt > (大于) $gte > (大于等于) $lt < (小于) $lte < (小于等于) $ne ! (不等于) $in in (in) $nin !in (not in) 参考&#xff1a;https://docs.mongodb.com/manual/reference/operator/query/ $eq 语法&#xff1a; { <field>: { …

myeclipse使用git图文教程

Git介绍与使用 1、什么是Git Git是分布式版本控制系统 Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 2、集中式版本控制系统&#xff08;CVS / SVN等&#xff09; 集中式版本控制系统&#xff0c;版本库是集中存放在中央服务器…

汇编64讲(搞免杀、破解必看)

希望大家喜欢!每个课程有1个小时 学完包你会免杀,免的出神入画.....-_-!http://219.144.186.220/hbywjjk/下载地址&#xff08;也可以在线观看&#xff09;mms://221.11.20.228/hbywjjk/1/000.asfmms://221.11.20.228/hbywjjk/2/000.asfmms://221.11.20.228/hbywjjk/3/000.asfm…

centos 安装pm2

npm install -g pm2whereis pm2 pm2: /opt/nodejs/bin/pm2sudo ln -s /opt/nodejs/bin/pm2 /usr/bin/pm2