1. 程式人生 > >函式和常用模組【day04】:遞迴(五)

函式和常用模組【day04】:遞迴(五)

本節內容

  1. 作用域、區域性和全域性變數
  2. 遞迴
  3. 函數語言程式設計
  4. 高階函式和eval()函式

一、概述

在函式內部,可以呼叫其他函式。但是一個函式在內部呼叫自身,這個函式被稱為遞迴函式。

二、簡單介紹

那遞迴具體是怎麼實現的吶?下面我們就來看看如下程式碼:

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 ))   #呼叫函式自身  
=  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  = =  0 :          return  n      return  +  add_to_100(n - 1 )   =  add_to_100( 100 ) print (n)   #輸出 5050

 這個例子告訴我們,add_to_100(n-1)返回的是n-1+add_to_100(n-2)......這個就是遞迴的奧祕之處。

三、遞迴特性總結

  1. 必須要有一個明確的結束條件。
  2. 每次進入更深一層的遞迴時,問題規模相比上次遞迴都應該少(問題規模:比如你第1次傳進的是10,第2次遞迴應該是9...依次越來越少,不能越來越多)。
  3. 遞迴的效率不高,遞迴層次過多會導致記憶體溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧貞,每當函式返回,棧就會減一層棧貞。由於棧的大小不是無限的,所以遞迴的次數過多,會導致棧溢位)。

第3點關於這個記憶體溢位說明:棧不是無限的,它是有限的,過多會導致記憶體溢位。如圖: