遞歸函數recursion
函數直接或者間接調用自身,這就是遞歸函數。能用遞歸函數解決的問題,一般使用循環也可以解決。遞歸函數一定要有邊界
遞歸函數的案例
一、斐波那契數列
求斐波那契數列前n項
python語言的特點有哪些。def fib(n):return 1 if n < 1 else fib(n - 1) + fib(n - 2)for i in range(5):
print(fib(i), end=' ')
循環的寫法
def fib(n):
pre= 0cur= 1
for i inrange(n):
python字典創建方法,pre, cur= cur, pre +cur
print(cur, end=' ')
fib(5)
二、階乘
def fn(n):if n==1:return 1
return n * fn(n-1)
遞歸函數簡單實例?print(fn(5))
循環的寫法
def fn(n):
result=nfor i in range(1, n):
result*=ireturnresult
print(fn(5))
python菜鳥教程。三、冪
def p(x, y):if y == 0:return 1
return x * p(x, y - 1)
print(p(3, 3))
循環的寫法
def p(x, y):
能夠支持python開發的環境有哪些?result= 1
for _ inrange(y):
result*=x
print(result)
p(3, 3)
四、二分查找
python中屬于math庫中的數學函數。def search(seq, num, lower, upper):if lower ==upper:
assert num==seq[upper]returnupperelse:
middle= (lower + upper) //2
if num >seq[middle]:return search(seq, num, middle + 1, upper)else:returnsearch(seq, num, lower, middle)
# lst= [0,0,0,0,0,0]
lst= [4, 25, 8, 23, 4, 100, 95]
python中sort函數。lst.sort()
print(lst)
print(search(lst,0,0,0))
如果lower下限和upper上限相同,那么久可以斷言這就是要查找數字所在的位置,直接返回即可。否則,先找出中間位置,再確定是在左半部分還是在右半部分,適用遞歸調用函數即可。
可以將代碼的上限和下限參數給出默認值,這樣就使代碼更靈活
def search(seq, num, lower=0, upper=None):if upper isNone:
ls在python中的用法。upper= len(seq) - 1
if lower ==upper:
assert num==seq[upper]returnupperelse:
middle= (lower + upper) //2
if num >seq[middle]:return search(seq, num, middle + 1, upper)returnsearch(seq, num, lower, middle)
lst= [34, 67, 8, 123, 4, 100, 95]
python函數的定義和調用。lst.sort()
print(lst)
print(search(lst,34))
遞歸函數的深度問題
Python對遞歸函數的深度做了限制,默認最大1000次,可以使用sys.getrecursionlimit()查詢,使用sys.setrecursionlimit()進行修改
import sys
python怎么定義函數,print(sys.getrecursionlimit())
結果
1000
如果超出了遞歸深度的限制,將跑出異常RecursionError: maximum recursion depth exceeded
def fn():returnfn()
fn()
python中遞歸函數特點?異常
File "C:/Users/ASUS-PC/PycharmProjects/函數.py", line 98, infnreturnfn()
RecursionError: maximum recursion depth exceeded
遞歸函數的性能
遞歸和循環的性能對比
遞歸的測試
python def函數。import datetime
start=datetime.datetime.now()
n=25def fib(n):return 1 if n < 2 else fib(n - 1) + fib(n - 2)for i inrange(n):
print(fib(n), end=' ')
delta= (datetime.datetime.now() -start).total_seconds()
print(delta)
python遞歸函數詳解、運行結果
0.751987
循環的測試
import datetime
start=datetime.datetime.now()
pre= 1cur= 1
字典的數據類型是序列類型嗎?for i in range(10000):
pre, cur= cur, pre +cur
print(cur,end=' ')
delta= (datetime.datetime.now() -start).total_seconds()
print(delta)
運行結果
0.048139
對于斐波那契數列的改進
def fib(n, pre=1, cur=1):
pre, cur= cur, pre +cur
print(cur, end=' ')if n == 2:returnfib(n- 1, pre, cur)
fib(300)
間接遞歸
通過其他函數調用自身,應該從代碼規范上規避這種情況
def fn():
fn1()
def fn1():
fn()
fn()
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态