演算法前戲 遞迴 二分尋找 列表尋找

來源:互聯網
上載者:User

標籤:迴圈   順序尋找   als   通過   highlight   退出   closed   one   元素   

一、遞迴

概念:

  函數直接或者間接的調用自身演算法的過程,則該函數稱為遞迴函式。在電腦編寫程式中,遞迴演算法對解決一大類問題是十分有效。

特點:

  ①遞迴就是在過程或者函數裡調用自身。

  ②在使用遞迴策略時,必須有一個明顯的結束條件,稱為遞迴出口。問題規模相比上次遞迴有所減少,

  ③遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的效率較低。所以一般不倡導使用遞迴演算法設計程式。

  ④在遞迴調用的過程當中系統的每一層的返回點、局部變數等開闢了棧來儲存。遞迴函式次數過多容易造成棧溢出等。

  所以一般不倡導用遞迴演算法設計程式。

要求:

遞迴演算法所體現的"重複"一般有三個條件:

  ①每次在調用規模上都有所縮小(通常是減半)。

  ②相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸出就作為後一次的輸入)。

  ③在問題的規模極小時必須用直接解答而不再進行遞迴調用,因而每次遞迴調用都是有條件的(以規模未達到直接解答的大小為條件),

無條件的遞迴調用將會成為死迴圈而不能正常結束。

分析以下函數的執行過程:

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 = 0    after = 1    if n == 0 or n == 1:        return n    if n <= 3:        return 1    return fibo(n-1)+fibo(n-2)print(fibo(3))
斐波那契數列二分尋找

  從有序列表的候選區data[0:n]開始,通過對待尋找的值與候選區中間值的比較,可以使候選區減少一半。

特點:

  二分尋找演算法就是不斷將數組進行對半分割,每次拿中間元素和要找的元素進行比較。小就向右找,大就向左找!

要求:  

  在一段數字內,找到中間值,判斷要找的值和中間值大小的比較。
    如果中間值大一些,則在中間值的左側地區繼續按照上述方式尋找。
    如果中間值小一些,則在中間值的右側地區繼續按照上述方式尋找。
  直到找到我們希望的數字。

def search_data(data,data_find):    # 中間值的索引號的定義:數組長度/2    mid = 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 = 0    high = len(data_set)-1    while low <= high:        mid = (low+high)//2        if data_set[mid] == value:            return mid        elif data_set[mid] > value:            high = mid - 1        else:            low = mid + 1
def bin_search(data_set,value,low,high):    if low <= high:        mid = (low+high)//2        if data_set[mid] == value:            return mid        elif 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 = 0    high = len(data_set)-1    while low <= high:        mid = (low+high)//2        if data_set[mid][‘id‘] == value:            return (mid,data_set[mid])        elif data_set[mid][‘id‘] > value:            high = mid - 1        else:            low = mid + 1    else:        return (0,None)flog = Truewhile flog:    sid = input("請輸入學號(退出:Q):").strip()    if sid.isdigit():        if sid.upper() == "Q":            flog = False        else:            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)

 

演算法前戲 遞迴 二分尋找 列表尋找

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.