python之递归函数和内建函数
知識預覽
- 遞歸函數
- 內建函數(Built-in Functions)
遞歸函數
定義:調用一個函數的過程中出現調用函數本身,成為函數的遞歸調用。
例1:
某公司四個員工坐在一起,問第四個人薪水,他說比第三個人多1000,問第三個人薪水,第他說比第二個人多1000,問第二個人薪水,他說比第一個人多1000,最后第一人說自己每月5000,請問第四個人的薪水是多少?
要知道第四個人的月薪,就必須知道第三個人的,第三個人的又取決于第二個人的,第二個人的又取決于第一個人的,而且每一個員工都比前一個多一千,數學表達式即:
salary(4)=salary(3)+1000 salary(3)=salary(2)+1000 salary(2)=salary(1)+1000 salary(1)=5000簡化為: salary(n)=salary(n-1)+1000 (n>1) salary(1)=5000 (n=1)其實,這就是一個遞歸函數,遞歸分為兩個階段:回溯和遞推。
第n個員工的薪水表示為第(n-1)個學生的薪水,可第(n-1)個學生的薪水仍然不知道,所以繼續回溯到第(n-2)個學生的薪水……直到第一個員工的薪水,此時,salary(1)已知不必再向前回溯了。然后開始第二個階段:遞推,從第一個員工的薪水可以推算出
第二個員工的薪水(6000),從第二個員工的薪水可以推算出第三個員工的薪水(7000)……一直推算出第第四個員工的薪水(8000)為止,遞歸結束。需要注意的一點是,遞歸一定要有一個結束條件,否則陷入無限死循環,這里salary(1)=5000就是結束條件。
流程圖:
?
代碼實現:
def salary(n):if n==1:return 5000return salary(n-1)+1000s=salary(4) print(s)例2: 通過遞歸求n的階乘
分析其數學表達式為:
(1)factorial(n)=n*factorial(n-1) (2)factorial(1)=1代碼實現:
def factorial(n):if n==1:return 1return n*factorial(n-1)print(factorial_new(3))遞歸函數的優點: 定義簡潔,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯處理會復雜一些。
遞歸特性:
必須有一個明確的結束條件
每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少遞歸效率不高,遞歸層次過多會導致棧溢出(
在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返 回,棧就會減一層棧幀。由于棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出。
練習:通過循環和遞歸兩種方式實現斐波那契數列
def fibo(n):before=0after=1for i in range(n-1):ret=before+afterbefore=afterafter=retreturn retprint(fibo(3))#**************遞歸********************* def fibo_new(n):#n可以為零,數列有[0]if n <= 1:return nreturn(fibo_new(n-1) + fibo_new(n-2))print(fibo_new(3)) 1 print(fibo_new(30000))#maximum recursion depth exceeded in comparison View Code 回到頂部內建函數(Built-in Functions)
| abs() | dict() | help() | min() | setattr() |
| all() | dir() | hex() | next() | slice() |
| any() | divmod() | id() | object() | sorted() |
| ascii() | enumerate() | input() | oct() | staticmethod() |
| bin() | eval() | int() | open() | str() |
| bool() | exec() | isinstance() | ord() | sum() |
| bytearray() | filter() | issubclass() | pow() | super() |
| bytes() | float() | iter() | print() | tuple() |
| callable() | format() | len() | property() | type() |
| chr() | frozenset() | list() | range() | vars() |
| classmethod() | getattr() | locals() | repr() | zip() |
| compile() | globals() | map() | reversed() | __import__() |
| complex() | hasattr() | max() | round() | ? |
| delattr() | hash() | memoryview() | set() | ? |
轉載于:https://www.cnblogs.com/skyflask/articles/8282673.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python之递归函数和内建函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IIS(1)
- 下一篇: python3----练习题(装饰器)