算法前戏 递归 二分查找 列表查找
一、遞歸
概念:
函數(shù)直接或者間接的調(diào)用自身算法的過(guò)程,則該函數(shù)稱為遞歸函數(shù)。在計(jì)算機(jī)編寫(xiě)程序中,遞歸算法對(duì)解決一大類(lèi)問(wèn)題是十分有效的。
特點(diǎn):
①遞歸就是在過(guò)程或者函數(shù)里調(diào)用自身。
②在使用遞歸策略時(shí),必須有一個(gè)明顯的結(jié)束條件,稱為遞歸出口。問(wèn)題規(guī)模相比上次遞歸有所減少,
③遞歸算法解題通常顯得很簡(jiǎn)潔,但遞歸算法解題的效率較低。所以一般不倡導(dǎo)使用遞歸算法設(shè)計(jì)程序。
④在遞歸調(diào)用的過(guò)程當(dāng)中系統(tǒng)的每一層的返回點(diǎn)、局部變量等開(kāi)辟了棧來(lái)存儲(chǔ)。遞歸函數(shù)次數(shù)過(guò)多容易造成棧溢出等。
所以一般不倡導(dǎo)用遞歸算法設(shè)計(jì)程序。
要求:
遞歸算法所體現(xiàn)的"重復(fù)"一般有三個(gè)條件:
①每次在調(diào)用規(guī)模上都有所縮小(通常是減半)。
②相鄰兩次重復(fù)之間有緊密的聯(lián)系,前一次要為后一次做準(zhǔn)備(通常前一次的輸出就作為后一次的輸入)。
③在問(wèn)題的規(guī)模極小時(shí)必須用直接解答而不再進(jìn)行遞歸調(diào)用,因而每次遞歸調(diào)用都是有條件的(以規(guī)模未達(dá)到直接解答的大小為條件),
無(wú)條件的遞歸調(diào)用將會(huì)成為死循環(huán)而不能正常結(jié)束。
分析以下函數(shù)的執(zhí)行過(guò)程:
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)根據(jù)Python執(zhí)行的過(guò)程,及函數(shù)調(diào)用去分析執(zhí)行結(jié)果!
?關(guān)于斐波拉契數(shù)列
斐波拉契數(shù)列指的是這樣一個(gè)數(shù)列: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項(xiàng)是0,第1項(xiàng)是第一個(gè)1。這個(gè)數(shù)列從第2項(xiàng)開(kāi)始,每一項(xiàng)都等于前兩項(xiàng)之和。
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)) 斐波那契數(shù)列二分查找
從有序列表的候選區(qū)data[0:n]開(kāi)始,通過(guò)對(duì)待查找的值與候選區(qū)中間值的比較,可以使候選區(qū)減少一半。
特點(diǎn):
二分查找算法就是不斷將數(shù)組進(jìn)行對(duì)半分割,每次拿中間元素和要找的元素進(jìn)行比較。小就向右找,大就向左找!
要求:
在一段數(shù)字內(nèi),找到中間值,判斷要找的值和中間值大小的比較。
如果中間值大一些,則在中間值的左側(cè)區(qū)域繼續(xù)按照上述方式查找。
如果中間值小一些,則在中間值的右側(cè)區(qū)域繼續(xù)按照上述方式查找。
直到找到我們希望的數(shù)字。
列表查找
列表查找:從列表中查找指定元素
輸入:列表、待查找元素
輸出:元素下標(biāo)或未查找到元素
一般是有兩種方法:
1、順序查找
從列表第一個(gè)元素開(kāi)始,順序進(jìn)行搜索,直到找到為止。
def linear_search(data_set,value):for i in data_set:if data_set[i] == value:return i2、二分查找
從有序列表的候選區(qū)data[0:n]開(kāi)始,通過(guò)對(duì)待查找的值與候選區(qū)中間值的比較,可以使候選區(qū)減少一半。
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 二分查找遞歸版練習(xí)題:
現(xiàn)有一個(gè)學(xué)員信息列表(按id增序排列),格式為:[{"id":1001, "name":"張三", "age":20},{"id":1002, "name":"李四", "age":25},{"id":1004, "name":"王五", "age":23},{"id":1007, "name":"趙六", "age":33}]修改二分查找代碼,輸入學(xué)生id,輸出該學(xué)生在列表中的下標(biāo),并輸出完整學(xué)生信息。 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ǐng)輸入學(xué)號(hào)(退出:Q):").strip()if sid.isdigit():if sid.upper() == "Q":flog = Falseelse:sid = int(sid)mid,infos = bin_search(l,sid)if not infos:print("查無(wú)此人!!!")else:s = "學(xué)生學(xué)號(hào):{id},姓名:{name},年齡:{age}".format(**infos)print("該學(xué)生所在信息索引坐標(biāo):%s"%mid)print("該學(xué)生的所有信息:%s"%s)?
轉(zhuǎn)載于:https://www.cnblogs.com/zh605929205/p/7467231.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的算法前戏 递归 二分查找 列表查找的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 字符串不替代_TI-Nspire 系列的
- 下一篇: 短视频网站源码干货分享:如何实现背景音乐