python遞歸算法(無限遞歸,正常遞歸,階乘)
一、嵌套調(diào)用的過程
def show1(): print("show 1 run start") show2() print("show 1 run end") def show2(): print("show 2 run start") show3() print("show 2 run end") def show3(): print("show 3 run start") print("show 3 run end") show1()
執(zhí)行結(jié)果
show 1 run start
show 2 run start
show 3 run start
show 3 run end
show 2 run end
show 1 run end
嵌套調(diào)用的過程圖解
函數(shù)一旦執(zhí)行結(jié)束,一會先回到調(diào)用處
二、遞歸的基本原則
1、遞歸的基本原則
遞歸函數(shù)通常遵循以下原則:
- 定義基本情況:確定一個或多個輸入的特殊情況,當(dāng)滿足這些條件時,遞歸函數(shù)將直接返回結(jié)果而不再調(diào)用自身。
- 減小問題規(guī)模:通過調(diào)用自身來解決一個規(guī)模更小的問題,這樣每次遞歸調(diào)用都在問題規(guī)模上取得了進(jìn)展。也就是需要一個已定義好的規(guī)則來使其它非基本的情況轉(zhuǎn)化為基本情況。
- 終止條件:遞歸函數(shù)必須包含能夠?qū)е潞瘮?shù)不再遞歸調(diào)用的條件,以避免無限遞歸。
2、無限遞歸調(diào)用
def show(): print("show run start") show() print("show run end") show()
無限遞歸調(diào)用報錯
RecursionError: maximum recursion depth exceeded while calling a Python object
3、正常遞歸調(diào)用
def show(n): print(f"show run start-{n}") if n<10: show(n+1) print(f"show run end-{n}") show(1)
遞歸函數(shù)同嵌套函數(shù)調(diào)用一樣:誰調(diào)用的你,返回到調(diào)用處
show run start-1
show run start-2
show run start-3
show run start-4
show run start-5
show run start-6
show run start-7
show run start-8
show run start-9
show run start-10
show run end-10
show run end-9
show run end-8
show run end-7
show run end-6
show run end-5
show run end-4
show run end-3
show run end-2
show run end-1進(jìn)程已結(jié)束,退出代碼為 0
當(dāng)代碼執(zhí)行到24行時,先恢復(fù)show(9)的狀態(tài)
show(9)是由show(8)的調(diào)用的,先恢復(fù)show(8)的狀態(tài)
依次
與嵌套函數(shù)調(diào)用過程相比:嵌套函數(shù)是由多個函數(shù)完成的,遞歸是有1個函數(shù)完成的
4、階乘問題
def f(n): if n==0 or n==1: return 1 return n*f(n-1) print(f(5))
執(zhí)行流程:
5 * f(4)
5 * (4 * f(3))
5 * (4 * (3 * f(2)))
5 * (4 * (3 * 2 * f(1))))
5 * (4 * (3 * 2 * 1))
5 * (4 * (3 * 2))
5 * (4 * 6)
5 * 24
120
5、力扣:231. 2 的冪
簡單
給你一個整數(shù) n,請你判斷該整數(shù)是否是 2 的冪次方。如果是,返回 true ;否則,返回 false 。
如果存在一個整數(shù) x 使得 n == 2x ,則認(rèn)為 n 是 2 的冪次方。
示例 1:
輸入:n = 1
輸出:true
解釋:20 = 1
示例 2:
輸入:n = 16
輸出:true
解釋:24 = 16
示例 3:
輸入:n = 3
輸出:false
示例 4:
輸入:n = 4
輸出:true
示例 5:
輸入:n = 5
輸出:false
class Solution: def isPowerOfTwo(self, n: int) -> bool: def panduan(s): if s <= 0: return False elif s == 1: return True elif s == 2: return True else: if s % 2 == 0: return panduan(s // 2) else: return False return panduan(n)
6、力扣面試題 08.05. 遞歸乘法
中等
遞歸乘法。 寫一個遞歸函數(shù),不使用 * 運(yùn)算符, 實現(xiàn)兩個正整數(shù)的相乘??梢允褂眉犹?、減號、位移,但要吝嗇一些。
示例1:
輸入:A = 1, B = 10
輸出:10
示例2:
輸入:A = 3, B = 4
輸出:12
提示:
保證乘法范圍不會溢出
class Solution: def multiply(self, A: int, B: int) -> int: if B == 0: return 0 return A + self.multiply(A, B - 1) r=Solution() A=3 B=4 print(r.multiply(A, B))
執(zhí)行流程
3+multiply(3, 3)
6+multiply(3, 2)
9+multiply(3, 1)
12+multiply(3, 0)
7、力扣、326. 3 的冪
簡單
給定一個整數(shù),寫一個函數(shù)來判斷它是否是 3 的冪次方。如果是,返回 true ;否則,返回 false 。
整數(shù) n 是 3 的冪次方需滿足:存在整數(shù) x 使得 n == 3x
示例 1:
輸入:n = 27
輸出:true
示例 2:
輸入:n = 0
輸出:false
示例 3:
輸入:n = 9
輸出:true
示例 4:
輸入:n = 45
輸出:false
class Solution: def isPowerOfTwo(self, n: int) -> bool: def panduan(s): if s <= 0: return False elif s == 1: return True elif s % 3 != 0: return False else: return panduan(s / 3) return panduan(n) r=Solution() n=9 print(r.isPowerOfTwo(n))
8、力扣342. 4的冪
簡單
給定一個整數(shù),寫一個函數(shù)來判斷它是否是 4 的冪次方。如果是,返回 true ;否則,返回 false 。
整數(shù) n 是 4 的冪次方需滿足:存在整數(shù) x 使得 n == 4x
示例 1:
輸入:n = 16
輸出:true
示例 2:
輸入:n = 5
輸出:false
示例 3:
輸入:n = 1
輸出:true
class Solution: def isPowerOfTwo(self, n: int) -> bool: def panduan(s): if s <= 0: return False elif s == 1: return True elif s % 4 != 0: return False else: return panduan(s // 4) return panduan(n) r=Solution() n=1 print(r.isPowerOfTwo(n))
到此這篇關(guān)于python遞歸算法(無限遞歸,正常遞歸,階乘)的文章就介紹到這了,更多相關(guān)python遞歸算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?判斷字符串當(dāng)中是否包含字符(str.contain)
這篇文章主要介紹了python?判斷字符串當(dāng)中是否包含字符(str.contain),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06Python使用PyPDF2和ReportLab操作PDF文件的詳細(xì)指南
在日常工作和項目中,PDF 文件處理是個常見需求,不論是合并報告、加密文檔、填充表單,還是生成發(fā)票,Python 中有許多用于操作 PDF 文件的庫,其中 PyPDF2 和 ReportLab 是兩個廣泛使用的工具,本文給大家介紹了Python使用PyPDF2和ReportLab操作PDF文件的詳細(xì)指南2025-01-01PythonPC客戶端自動化實現(xiàn)原理(pywinauto)
這篇文章主要介紹了Python基于pywinauto實現(xiàn)PC客戶端自動化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05Python利用pandas進(jìn)行數(shù)據(jù)合并詳解
當(dāng)使用Python中的pandas庫時,merge函數(shù)是用于合并(或連接)兩個數(shù)據(jù)框(DataFrame)的重要工具。它類似于SQL中的JOIN操作,下面我們就來看看它的具體操作吧2023-11-11Python?OpenCV超詳細(xì)講解圖像堆疊的實現(xiàn)
OpenCV用C++語言編寫,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要傾向于實時視覺應(yīng)用,并在可用時利用MMX和SSE指令,本篇文章帶你通過OpenCV實現(xiàn)圖像堆疊2022-04-04