python遞迴函式例題(Python遞迴函式)
本期筆記內容綜述
Python函式定義再回顧
函式的引數傳遞
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函式的引數傳遞
從一個栗子開始:
梯形面積:Trapezoid area
我們來設計一個名為:Trapezoid_area的函式計算梯形的面積
三個引數分別為:base_up(上底),base_down(下底),height(高)
梯形的面積=(上底 下底)×高÷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分鐘來理解了。
好了,本期筆記分享內容就到此以歉意結束,茄子暫別,每天都美好。祝願生活愉快!