python遞迴函式例題(Python遞迴函式)

本期筆記內容綜述

  1. Python函式定義再回顧

  2. 函式的引數傳遞

  3. Python函式遞迴問題

7分鐘學習系列

1.Python函式再回顧

著名的斐波拉契數列

除了第一個數和第二個數外,任意一個數都可由前兩個數相加得到:1,1,2,3,5,13,21,34····

且先看看定義

  • F1=1 F2=1

  • 將上面文字轉化為符號語言:Fn=Fn-1 Fn-2 n>2

  • 由於Python索引號從0開始,因此我們把開始改為0.

  • 程式碼執行[1]

且先看看前幾項

  • 問題:如果你想自定義斐波拉契數列的個數該如何是好?'

  • 程式碼執行[2]

for 迴圈

  • '函式該如何寫呢?'

函式結果

  • 問題:如果只要展示指定的斐波拉契數列數呢?

執行結果

  • 'range()函式再介紹'

range(i,j,[步長值]),預設步長為1,建立的物件表示值為i到j-1的整數。

rang( )函式

2.Python函式的引數傳遞

  • 從一個栗子開始:

  1. 梯形面積:Trapezoid area

  2. 我們來設計一個名為:Trapezoid_area的函式計算梯形的面積

  3. 三個引數分別為:base_up(上底),base_down(下底),height(高)

  4. 梯形的面積=(上底 下底)×高÷2

  • 程式碼執行

執行結果

  • '不難看出來引數1,2,3分別對應base_up(上底),base_down(下底),height(高)。

提供關鍵字引數傳導

  • 關鍵字引數傳導如何呼叫呢?

  • 方法:在呼叫函式名後面圓括號內(引數關鍵字2=引數值,引數關鍵字1=引數值),不必拘泥於原來的順序了。

  • 程式碼執行[1]

程式碼執行結果

  • 程式碼執行結果[2]

結果2

  • '呼叫函式提供引數的時候,按順序傳遞的引數是要位於關鍵字引數之前,而且不能有重複的情況'

3.Python函式遞迴問題

  • 重大問題:遞迴

  • 我想遞迴這個詞大家最初接觸的時候是曾經瞭解數列的時候,

  • 其實我們之前給出的斐波拉契數列就是一個遞迴,可以無窮的進行下去。

  • 接下來我們再看兩個常見的遞迴:階乘和冪

3.1階乘

且先看排列

  • 且看栗子:

程式碼1

  • 遞迴寫法

遞迴結果

3.2 冪

基礎函式寫法

  • '更改為遞迴模式:'

    1.對於任意數字x來說,power(x,0)結果是1,任何數的零次冪都是1

    2.對於任何大於0的數來說,power(x,n)是x乘以power(x,n-1)

  • 其實寫遞迴首先要做的是理解概念

遞迴結果

  • '可是我還是沒看出遞迴到底和迴圈的幫助有多大?'

  • '還記得昨天的課後題嗎?'

上一期筆記內容問題解答

  • 回顧問題

問題回顧

  • '現在來看看當初絞盡腦汁寫的上面這串程式碼吧,來思考下如何寫它的遞迴'


  • '''首先我們來總結下前面兩個的遞迴的例子的方法:

1.核心:找到一個初始值,再找到一個遞迴迴圈部分;

2.初始值:最外層沒進行的遞迴部分的最開始的基本例項反應值;{遞迴一定要有函式返回值,否者就永不停止了}

3.遞迴部分:找到重複出現的部分,如前兩個栗子中相鄰兩個的關係:第n個和第n-1的結果的關係即遞推式.

4.用條件語句中一個分支寫初始值的,一部分寫遞迴迴圈部分呼叫自身的函式。

5.關鍵:理解定所要做的事情的含義。#其實可以參考數學歸納法來理解

  • isinstance( )函式是檢查某個特定的識別符號是否含有某個資料型別,在這裡之所以寫出上面如此複雜的函式:是因為單獨的一個for迴圈下來,列表中的列表是全部列印出來,而不能全部按行提取出來

  • 重新觀看程式碼,很快我們發現:

程式碼問題

1.上面程式碼12行和34,56,7行基本一致,只是換了個元素名和列表名在重複。從這裡我們可以找遞迴迴圈體

2.根據意圖可知:都在做一件事情,判斷元素是否屬於列表,如果不是就輸出元素(初始對應值),如果是繼續操作下去(遞迴迴圈體部分)。

3.程式碼執行:

問題答案

  • 對比下兩段程式碼,我相信你一定體會到遞迴的方便的吧。

  • 程式設計師在解決問題位目標的基礎下,應該學會偷懶。

  • 不管影迷的資訊需要多少更深層的巢狀列表,遞迴函式不需要做任何改變可以任意處理。

3.3 二分法原理

  • 要求:必須掌握,請自己編寫一個二分法的操作,不要侷限於下面程式碼。

  • '''首先什麼是二分法呢?先看看定義確保自己知道接下來在做什麼。

前提:排好序

若上下限相同,則那就是數字所在位置,返回;

否則,找到兩者的中間,查詢數字是在左側還是右側,繼續查詢數字所在的那半部分。

  • 在給出的有序排列的陣列中,把目標值和陣列中間值進行比較,

1.如果相等,則返回中間值下標,

2.如果目標值小於中間值,就從陣列的前半段(左側)再次執行二分法查詢,

3.如果目標值大於中間值,從陣列的後半段(右側)開始二分法查詢。

  • 程式碼執行

二分法

  • 很抱歉,似乎內容已經超過7分鐘來理解了。

  • 好了,本期筆記分享內容就到此以歉意結束,茄子暫別,每天都美好。祝願生活愉快!