首頁 >後端開發 >Python教學 >python中高階函數實作剪枝函數的方法

python中高階函數實作剪枝函數的方法

小云云
小云云原創
2018-03-29 14:30:272154瀏覽

本文主要為大家詳細介紹了python利用高階函數實現剪枝函數的相關資料,具有一定的參考價值,有興趣的小夥伴們可以參考一下,希望能幫助到大家。

案例:

       某些時候,我們想要為多個函數,增加某種功能,例如計時統計,記錄日誌,快取運算結果等等

       需求:

             在每個函數中不需要加上完全相同的程式碼

如何解決?

       將相同的程式碼抽調出來,定義成裝飾器

             等於前兩項之和

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

      

上階梯問題邏輯整理:

              每次踏出都是1~3 個階梯,剩下是7~#9 個台階

##若跨出1個台階,需要求出後面9個台階的走法

                          若踏出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_zhi
def fibonacci(n):
  if n <= 1:
    return 1
  return fibonacci(n-1) + fibonacci(n-2)
@jian_zhi
def 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__ == &#39;__main__&#39;:
  print(climb(10, (1, 2, 3)))
  print(fibonacci(20))

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

#######

以上是python中高階函數實作剪枝函數的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn