欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python遞歸及尾遞歸優(yōu)化操作實例分析

 更新時間:2020年02月01日 11:57:49   作者:dayL_W  
這篇文章主要介紹了Python遞歸及尾遞歸優(yōu)化操作,結合實例形式分析了Python遞歸及尾遞歸優(yōu)化相關概念、原理、應用與操作技巧,需要的朋友可以參考下

本文實例講述了Python遞歸及尾遞歸優(yōu)化操作。分享給大家供大家參考,具體如下:

1、遞歸介紹

遞歸簡而言之就是自己調用自己。使用遞歸解決問題的核心就是分析出遞歸的模型,看這個問題能拆分出和自己類似的問題并且有一個遞歸出口。比如最簡單的就5的階乘,可以把它拆分成5*4!,然后求4!又可以調用自己,這種問題顯然可以用遞歸解決,遞歸的出口就是求1!,可以直接返回1。用Python實現(xiàn)如下:

def fact(n):
  if n==1:
    return n
  return n*fact(n - 1);
print(fact(5))

運行結果:

120

2、尾遞歸優(yōu)化

在上面的求遞歸中,也有一定的缺點,假如說求1000!的階乘,會出現(xiàn)棧溢出的問題,因為在函數(shù)執(zhí)行中,沒調用一個函數(shù)都會把當前函數(shù)的調用位置和內部變量保存在棧里面,由于棧的空間不是無限大(具體棧的最大空間還沒有查找到),假如說調用層數(shù)過多,就是出現(xiàn)棧溢出的情況。

這個時候就可以用尾遞歸優(yōu)化來解決,尾調用的概念非常簡單,一句話就能說清楚,就是指某個函數(shù)的最后一步是調用另一個函數(shù)。

function f(x){
 return g(x);
}

尾遞歸優(yōu)化后的階乘函數(shù)如下:

def fact(n):
  return fact_iter(n,1);
def fact_iter(num, product):
  if num == 1:
    return product
  return fact_iter(num - 1, num * product)
print(fact(5))
print(fact(1000))

尾調用由于是函數(shù)的最后一步操作,所以不需要保留外層函數(shù)的調用記錄,因為調用位置、內部變量等信息都不會再用到了。所以尾遞歸優(yōu)化可以有效的防止棧溢出,但是尾遞歸優(yōu)化需要編譯器或者解釋器的支持,遺憾的是,大多數(shù)編程語言沒有針對尾遞歸做優(yōu)化,Python解釋器也沒有做優(yōu)化,所以,即使把上面的fact(n)函數(shù)改成尾遞歸方式,也會導致棧溢出。

3、漢諾塔問題

漢諾塔問題也是一個經典的遞歸問題,具體題目就不說了,這里分析思路。假設hanoi(n, a, b, c)實現(xiàn)把a上的n個盤子移到c上。

當只有一個盤子時,直接從A移動到C即可

如果有3個盤子,可以這樣:

# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C

如果有很多盤子,我們分析一下該怎么移動,首先,我們需要把n-1個盤子移動到b中,才可以實現(xiàn)最簡單的一步,把a中最大的盤子移動到c中,具體怎么轉移到b中后面再討論。移動最大的盤子后,a和c都可以看成是空的,接下來,把b看成是a,把a看成是b,把a中的n-1個盤子(這里的n是已經減1的n)移動到b后,又可以移動第二大的盤子。這顯然是一個遞歸問題。

遞歸的出口就是n等于1,直接從a移動到c即可。

那么怎么接下來討論,怎么把n-1個盤子移動到b,這不又是一個遞歸問題嘛!可以調用它自己呀,只不過需要把b看成是c,把c看成是b。所以代碼如下:

def hanoi(n,a,b,c):
  #只有一個盤子,直接移動
  if n==1:
    print(a,'->',c)
  else:
    #通過c把n-1個盤子移動到b
    hanoi(n-1, a,c,b)
    #移動最大的盤子
    print(a,'->',c)
    #通過a把n-1個盤子移動到c
    hanoi(n-1, b,a,c)
hanoi(3,'A','B','C')

運行結果:

A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C

轉自https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756044276a15558a759ec43de8e30eb0ed169fb11000

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結構與算法教程》、《Python列表(list)操作技巧總結》、《Python編碼操作技巧總結》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程

希望本文所述對大家Python程序設計有所幫助。

相關文章

  • Python Reduce函數(shù)的高級用法詳解

    Python Reduce函數(shù)的高級用法詳解

    這篇文章主要介紹了reduce函數(shù)的工作原理和應用,同時提供豐富的示例代碼,方便更好地理解如何使用reduce函數(shù)來輕松解決復雜的數(shù)據(jù)聚合問題,需要的可以參考下
    2023-11-11
  • Python基礎之變量基本用法與進階詳解

    Python基礎之變量基本用法與進階詳解

    這篇文章主要介紹了Python基礎之變量基本用法與進階,結合實例形式詳細分析了Python變量引用、可變和不可變類型、局部變量和全局變量等相關原理與使用技巧,需要的朋友可以參考下
    2020-01-01
  • Python+Socket實現(xiàn)基于UDP協(xié)議的局域網廣播功能示例

    Python+Socket實現(xiàn)基于UDP協(xié)議的局域網廣播功能示例

    這篇文章主要介紹了Python+Socket實現(xiàn)基于UDP協(xié)議的局域網廣播功能,結合實例形式分析了Python+socket實現(xiàn)UDP協(xié)議廣播的客戶端與服務器端功能相關操作技巧,需要的朋友可以參考下
    2017-08-08
  • 利用Python操作MongoDB數(shù)據(jù)庫的詳細指南

    利用Python操作MongoDB數(shù)據(jù)庫的詳細指南

    MongoDB是由C++語言編寫的非關系型數(shù)據(jù)庫,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng),其內容存儲形式類似JSON對象,下面這篇文章主要給大家介紹了關于利用Python操作MongoDB數(shù)據(jù)庫的相關資料,需要的朋友可以參考下
    2023-02-02
  • 使用Python函數(shù)進行模塊化的實現(xiàn)

    使用Python函數(shù)進行模塊化的實現(xiàn)

    這篇文章主要介紹了使用Python函數(shù)進行模塊化的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Django url,從一個頁面調到另個頁面的方法

    Django url,從一個頁面調到另個頁面的方法

    今天小編就為大家分享一篇Django url,從一個頁面調到另個頁面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 使用python編寫android截屏腳本雙擊運行即可

    使用python編寫android截屏腳本雙擊運行即可

    使用python編寫一個截屏的腳本,雙擊運行腳本就OK,截屏成功后會將截屏文件已當前時間命名,并保存在存放腳本的當前路徑的screenshot文件夾下
    2014-07-07
  • python類的繼承實例詳解

    python類的繼承實例詳解

    這篇文章主要介紹了python類的繼承實例詳解的相關資料,需要的朋友可以參考下
    2017-03-03
  • python Matplotlib數(shù)據(jù)可視化(2):詳解三大容器對象與常用設置

    python Matplotlib數(shù)據(jù)可視化(2):詳解三大容器對象與常用設置

    這篇文章主要介紹了python Matplotlib三大容器對象與常用設置的相關資料,幫助大家更好的學習和使用Matplotlib庫的用法,感興趣的朋友可以了解下
    2020-09-09
  • python自動化工具之pywinauto實例詳解

    python自動化工具之pywinauto實例詳解

    這篇文章主要為大家詳細介紹了python自動化工具之pywinauto實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評論