在函數內部,可以呼叫其他函數。如果一個函數在內部呼叫自身本身,這個函數就是一個遞歸函數。
實際上遞歸函數是在堆疊記憶體上遞歸執行的,每次遞歸執行一次就會耗費一些堆疊記憶體。
堆疊記憶體的大小是限制遞歸深度的重要因素
求階乘
#計算階乘n! = 1 x 2 x 3 x … x n,
可以用函數fact(n)表示。
fact(n) = n! = 1 x 2 x 3 x … x (n-1) x n = (n-1)! x n = fact(n-1) x n
fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
於是,fact(n)用遞迴的方式寫出來就是:def fact(n): if n == 1: return 1 return n * fact(n - 1)
如果计算fact(6),可以根据函数定义看到计算过程如下:
def fac(n): if n==1: return 1 else: res=n*fac(n-1) return res print(fac(6))
运行结果:
斐波拉契级数
有这样一个数列:1,1,2,3,5,8,13,21,34…。其第一元素和第二个元素等于 1,其他元素等于其前面两个元素的和。
例:
def fab(n): # 定义斐波拉契级数 if n in [1, 2]: # 如果n=1或者2 return 1 return fab(n - 1) + fab(n - 2) # n>2 print(fab(1)) # 斐波拉契级数的第一个元素 print(fab(2)) # 斐波拉契级数的第二个元素 print(fab(8)) # 斐波拉契级数的第8个元素print(fab(13)) # 斐波拉契级数的第9个元素
运行结果:
递归函数的优点
定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
递归需要注意递归的深度。由于递归会产生多次函数调用,而函数调用会消耗代码的栈空间,如果递归的深度太大,会导致栈溢出。以上面的阶乘为例,如果计算 100000 的阶乘,在一般机器上都会出现栈溢出的问题。
print(fac(10000))
如下所示:
本文基於Python基礎。 Python標準的解釋器沒有針對尾遞歸做最佳化,任何遞歸函數都存在棧溢位。介紹了在使用遞歸函數的優缺點,優點是邏輯簡單清晰,缺點是過深的呼叫會導致堆疊溢位。
以上是一篇文章帶你了解Python遞迴函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!