python利用高階函數實現剪枝函數,python高階

來源:互聯網
上載者:User

python利用高階函數實現剪枝函數,python高階

本文為大家分享了python利用高階函數實現剪枝函數的具體代碼,供大家參考,具體內容如下

案例:

       某些時候,我們想要為多個函數,添加某種功能,比如計時統計,記錄日誌,緩衝運算結果等等

       需求:

              在每個函數中不需要添加完全相同的代碼

如何解決?

       把相同的代碼抽調出來,定義成裝飾器

              求斐波那契數列(黃金分割數列),從數列的第3項開始,每一項都等於前兩項之和

         求一個共有10個台階的樓梯,從下走到上面,一次只能邁出1~3個台階,並且不能後退,有多少中方法?

       上台階問題邏輯整理:

              每次邁出都是 1~3 個台階,剩下就是 7~9 個台階

                     如果邁出1個台階,需要求出後面9個台階的走法

                     如果邁出2個台階,需要求出後面8個台階的走法

                     如果邁出3個台階,需要求出後面7個台階的走法

              此3種方式走法,通過遞迴方式實現,遞迴像樹,每次遞迴都產生子節點函數

以上兩個問題通過遞迴來解決,就會出現一個問題,出現重複求解問題,把重複求解的過程剔除掉,在c++語言中稱為剪枝函數

#!/usr/bin/python3  def jian_zhi(func):  # 中間字典,判斷已經是否求解過  median = {}     def wrap(*args):    # 假如不在中間字典中,說明沒有求解過,添加到字典中去,在的話,直接返回    if args not in median:      median[args] = func(*args)    return median[args]  return wrap @jian_zhidef fibonacci(n):  if n <= 1:    return 1  return fibonacci(n-1) + fibonacci(n-2) @jian_zhidef climb(n, steps):  count = 0  # 當最後台階為0的時候,說明最後只是走了一次  if n == 0:    count = 1  # 當最後台階不為0的時候,說明還需要走至少一次  elif n > 0:    # 對三種情況進行分別處理momo    for step in steps:      count += climb(n-step, steps)         # 返回每次遞迴的計數  return count if __name__ == '__main__':  print(climb(10, (1, 2, 3)))  print(fibonacci(20))

  所謂的剪枝函數不過是保證每次遞迴的函數唯一性,利用中間字典儲存已經執行過得函數和參數,通過判斷參數,剔除重複的函數調用

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.