python遞歸算法(上)

2020-12-11 葉子陪你玩編程

什麼是遞歸

在函數內部,是可以調用其他函數的。如果一個函數在內部調用自身,就稱這個函數就是遞歸函數。

舉個例子:

實現一個可以自定義重複列印你好的函數。

要實現重複列印,可能我們立馬就會想到使用循環。

如果要求不能使用循環呢,那我們就可以通過下面的方法來實現。

原理很好理解,就是不斷的調用自身,如果前面不加上if條件判斷,理論上是會陷入死循環的,但是實際上遞歸到一定次數(最大遞歸次數)就會報錯停止。

遞歸有什麼用

知道遞歸是怎麼回事,那麼遞歸有什麼實際用處嘛,或者說有什麼獨特之處。比如上面的例子用循環就很方便,我為什麼還要學習遞歸這種方法呢?

遞歸實際上是一種解決問題的方法,將問題分解為更小的子問題,直到得到一個足夠小的問題可以被很簡單的解決。對於非常簡單的問題,可能我們使用循環就非常方便,比如前面的那個案例,但是有些問題如果使用循環,可能就會非常麻煩,或者解決方案很難讓人理解清楚裡面的邏輯。

因為遞歸函數是找到最小問題的解決方法,然後只要不斷使用這個方法就可以解決了,所以遞歸函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。

下面就通過一些案例來實際感受一下。

遞歸的應用

1.計算階乘n! = 1 x 2 x 3 x ... x n

本案例來源於廖雪峰的網站

factorial(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = factorial(n-1) x n

所以,factorial(n)可以表示為n x factorial(n-1),只有n=1時需要特殊處理。

於是,factorial(n)用遞歸的方式寫出來就是:

在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。

===> factorial(5)

===> 5 * factorial(4)

===> 5 * (4 * factorial(3))

===> 5 * (4 * (3 * factorial(2)))

===> 5 * (4 * (3 * (2 * factorial(1))))

===> 5 * (4 * (3 * (2 * 1)))

===> 5 * (4 * (3 * 2))

===> 5 * (4 * 6)

===> 5 * 24

===> 120

2.斐波那契數列

列舉可以得出0,1,1,2,3,5,Fib(n-2),Fib(n-1),Fib(n);除了第一項和第二項都為1外(0忽略),需要單獨拿出來,其它項都滿足Fib(n)=Fib(n-2)+Fib(n-1)

模仿Fib函數當i = 5的執行過程。

函數如果調用自己比較難理解,可以看作調用其它函數,只不過和自己長的相同而已相同而已。

3.螺旋線

每一次都是前進length長度,然後右轉,長度需要不斷的減小,直到小於5停止。

(全文完)

教你實現一個gif處理軟體(下)

如何理解python一行代碼實現一個愛心字符畫?

顯示進度下載圖片

如何使用python實現文本進度條?

相關焦點

  • python算法遞歸於尾遞歸!
    遞歸概念遞歸:程序調用自身的編程技巧稱為遞歸( recursion)。用一種通俗的話來說就是自己調用自己,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的、但是規模較小的問題來求解,當問題小到一定規模的時候,需要一個遞歸出口返回。
  • 「通俗易懂的文字」+「經典的案例」希望能讓你順利入門「遞歸算法」
    遞歸是非常常見的一種算法,非常經典,可以解決非常多的問題。但我估計雖然大部分人知道遞歸,也能看得懂遞歸,但在實際運用中,很容易被遞歸給搞暈(數據,變量,函數等來回的出棧入棧)。今天寫篇文章分享下,或許,能夠給你帶來一些幫助。
  • 送你一份Python算法的打怪升級路線圖 | 用 Python 實現各種常用算法
    包括二分法,牛頓遞歸等等。我們將在接下來的章節裡,逐一介紹這兩種方法。二分法二分法:對於區間[a,b]上連續不斷且 f(a)·f(b)<0 的函數 y=f(x),通過不斷地把函數 f(x)的零點所在的區間一分為二,使區間的兩個端點逐步逼近零點,進而得到零點近似值的方法叫二分法。
  • java 數據結構與算法 之遞歸算法
    我們也只有一點一點的積累,趁現在有時間,今天討論一下java 的數據結構與算法:遞歸算法,希望能達到溫故而知新的效果。一。定義:遞歸(recursion):是指定義自身的同時又出現了對自身的引用。遞歸算法:同理一個算法直接或間接調用自己就叫遞歸算法。一個有意義的遞歸算法總是包含兩部分:遞歸的調用與遞歸的終止條件。二。
  • JAVA開發之——遞歸算法
    一、遞歸的定義和優缺點遞歸算法的定義:遞歸算法是一種直接或者間接地調用自身算法的過程。遞歸算法的優缺點: (1) 在計算機編寫程序中, 遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易於理解。 (2) 遞歸算法解題通常顯得很簡潔,但運行效率較低。所以一般不提倡用遞 歸算法設計程序。 (3) 在遞歸調用的過程當中系統為每一層的返回點、局部量等開闢了棧來存 儲。遞歸次數過多容易造成棧溢出等。
  • 算法圖解 | 遞歸算法和棧的應用
    遞歸算法:什麼是遞歸呢?兩種方法的偽代碼:後面這種方法中,便利用了遞歸算法,自己調用自己,從代碼中看到,是不是遞歸的方法更加清晰一些。特點:遞歸只是讓解決方案更清晰,並沒有性能上的優勢。基線條件和遞歸條件:對於循環,我們都知道有一個循環條件,一旦不滿足這個條件,算法會停止循環跳出。
  • 詳細解讀Python 遞歸函數!
    /sum.py循環求和: 5050遞歸求和: 5050遞歸函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。***使用遞歸函數需要注意防止棧溢出。在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。
  • memoization:讓遞歸算法更高效
    21CTO導讀:本文為學習如何使用稱為memoization的技術通過動態編程使遞歸算法變得高效。
  • 程式設計師必會算法系列之——「遞歸算法」
    講遞歸算法時會涉及到「棧」數據結構的一些知識,如果有不太了解的可以看這裡遞歸的缺點使用遞歸算法時每次方法的調用都需要在棧中開闢出一個空間保存相關數據,頻繁的壓棧、彈棧會導致效率變低。遞歸使用注意事項1、使用遞歸算法解決問題必須要有出口,不然就形成死循環了。
  • 藍橋杯簡單java遞歸算法
    首先先簡介下遞歸算法:遞歸算法(英語:recursion algorithm)在計算機科學中是指一種通過重複將問題分解為同類的子問題而解決問題的方法。遞歸式方法可以被用於解決很多的計算機科學問題,因此它是計算機科學中十分重要的一個概念。
  • Python遞歸函數、閉包和裝飾器
    什麼是遞歸函數  函數直接或間接的調用自己本身可有解決循環上的問題import timedef 遞歸一定要控制遞歸的層數,當符合某一條件時要終止遞歸,幾乎所有的遞歸都能用while循環來代替。缺點:遞歸因系統環境影響大,當遞歸過深,可能會得到不可預知的結果。
  • 算法與數據結構入門:棧與遞歸
    在此之前,我們介紹了動態規劃、深度優先搜索等基礎算法,但是,有部分好友評論說,難度太難了,我們知道動態規劃的自頂向下跟深度優先搜索一般都用遞歸實現,今天我們就先來講講算法與數據結構中,基礎中的基礎遞歸。講遞歸之前,我們先來了解下棧。
  • 算法基礎:五大排序算法Python實戰教程
    | George Seif翻譯 | 鄧普斯傑弗校對 | shunshun 整理 | 菠蘿妹原文連結:https://medium.com/@george.seif94/a-tour-of-the-top-5-sorting-algorithms-with-python-code
  • Python中的快速排序算法,快速排序的優缺點,中級python技術點
    Python中的快速排序算法就像合併排序一樣,快速排序算法採用分治法的原理將輸入數組分為兩個列表,第一個包含小項目,第二個包含大項目。然後,該算法將對兩個列表進行遞歸排序,直到對結果列表進行完全排序為止。劃分輸入列表稱為對列表進行分區。
  • Python中的合併排序算法,合併排序的優缺點,中級python技術點
    Python中的合併排序算法合併排序是一種非常有效的排序算法。它基於分治法,這是一種用於解決複雜問題的強大算法技術。為了正確理解分治法,您應該首先了解遞歸的概念。遞歸涉及將問題分解成較小的子問題,直到它們足夠小以至於無法解決。在編程中,遞歸通常由調用自身的函數表示。
  • 遞歸算法 | 排列組合
    今天講的是遞歸算法的一種應用:排列組合(permutations),比較小難 ~  假設有字母abc,對它進行排列組合
  • 使用JavaScript 遞歸算法,匯總累加題目的分數值
    所謂遞歸算法,是將問題轉化為規模縮小的同類問題的子問題,每一個子問題都用一個同樣的算法去解決。一般來說,一個遞歸算法就是函數調用自身去解決它的子問題。使用遞歸算法實現大題的分數值匯總。我們先來看一下定義,所謂遞歸算法,是將問題轉化為規模縮小的同類問題的子問題,每一個子問題都用一個同樣的算法去解決。一般來說,一個遞歸算法就是函數調用自身去解決它的子問題。遞歸算法的特點:在函數過程中調用自身。在遞歸過程中,必須有一個明確的條件判斷遞歸的結束,既遞歸出口。
  • 通過一道面試題目,講一講遞歸算法的時間複雜度!
    面試官提示:「考慮一下遞歸算法」。那麼就可以寫出了如下這樣的一個遞歸的算法,使用遞歸解決了這個問題。一些同學可能一看到遞歸就想到了O(logn),其實並不是這樣,遞歸算法的時間複雜度本質上是要看: 「遞歸的次數 * 每次遞歸中的操作次數」。那再來看代碼,這裡遞歸了幾次呢?
  • Python 進階之遞歸函數一點都不難!
    遞歸是指函數/過程/子程序在運行過程序中直接或間接調用自身而產生的重入現象。在計算機編程裡,遞歸指的是一個過程:函數不斷引用自身,直到引用的對象已知。使用遞歸解決問題,思路清晰,代碼少。但是在主流高級語言中(如C語言、Pascal語言等)使用遞歸算法要耗用更多的棧空間,所以在堆棧尺寸受限制時(如嵌入式系統或者內核態編程),應避免採用。所有的遞歸算法都可以改寫成與之等價的非遞歸算法。(來源於百度,看不懂正常,術語就是不說人話)下面是筆者的個人理解:遞歸就是在函數內部調用自己的函數被稱之為遞歸。看不懂?
  • 用Python手寫五大經典排序算法,看完這篇終於懂了!
    前戲準備大家都知道從理論上講,我們一般會使用大O表示法測量算法的運行時複雜度。"大O表示法"表示程序的執行時間或佔用空間隨數據規模的增長趨勢。要正確理解分而治之,應該首先了解遞歸的概念。遞歸涉及將問題分解成較小的子問題,直到它們足夠小以至於無法解決。在編程中,遞歸通常由調用自身的函數表示。