函式和常用模組【day04】:遞迴(五)
阿新 • • 發佈:2018-11-01
本節內容
一、概述
在函式內部,可以呼叫其他函式。但是一個函式在內部呼叫自身,這個函式被稱為遞迴函式。
二、簡單介紹
那遞迴具體是怎麼實現的吶?下面我們就來看看如下程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def
calc(n):
print
(n)
if
int
(n
/
2
)
=
=
0
: #結束符
return
n
return
calc(
int
(n
/
2
))
#呼叫函式自身
m =
calc(
10
)
print
(
'----->'
,m)
#輸出結果
10
5
2
1
-
-
-
-
-
>
1
#最後返回的值
|
看到這邊,有限小夥伴有些蒙圈,好吧,下面我用一個圖,來解釋一下吧!請看圖:
根據程式碼,最後一層,一定需要一個結束符,來結束。
我們再來舉一個經常用到的例子,1+2+3+4+.....+100的例子:
1 2 3 4 5 6 7 8 9 10 |
def
add_to_100(n):
if
n
=
=
0
:
return
n
return
n
+
add_to_100(n
-
1
)
n
=
add_to_100(
100
)
print
(n)
#輸出
5050
|
這個例子告訴我們,add_to_100(n-1)返回的是n-1+add_to_100(n-2)......這個就是遞迴的奧祕之處。
三、遞迴特性總結
- 必須要有一個明確的結束條件。
- 每次進入更深一層的遞迴時,問題規模相比上次遞迴都應該少(問題規模:比如你第1次傳進的是10,第2次遞迴應該是9...依次越來越少,不能越來越多)。
- 遞迴的效率不高,遞迴層次過多會導致記憶體溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧貞,每當函式返回,棧就會減一層棧貞。由於棧的大小不是無限的,所以遞迴的次數過多,會導致棧溢位)。
第3點關於這個記憶體溢位說明:棧不是無限的,它是有限的,過多會導致記憶體溢位。如圖: