C語言中的特殊函式 持續更新中

2021-09-11 02:06:07 字數 1783 閱讀 1312

1、遞迴函式

1.1、遞迴函式:乙個函式呼叫它自己本身,則這個函式就是遞迴函式。

1.2、使用遞迴函式的條件:

1.2.1、採用遞迴方法來解決問題,必須符合以下三個條件:

1.2.1.1、可以把要解決的問題轉化為乙個新問題,而這個新的問題的解決方法仍與原來的解決方法相同,只

所處理的物件有規律地遞增或遞減。

說明:解決問題的方法相同,呼叫函式的引數每次不同(有規律的遞增或遞減),如果沒有規律也就不能適

用遞迴呼叫。

1.2.1.2、可以應用這個轉化過程使問題得到解決。

說明:使用其他的辦法比較麻煩或很難解決,而使用遞迴的方法可以很好地解決問題。

1.2.1.3、必定要有乙個明確的結束遞迴的條件。

說明:一定要能夠在適當的地方結束遞迴呼叫。不然可能導致系統崩潰。

1.3、遞迴函式說明:

1.3.1、當函式自己呼叫自己時,系統將自動把函式中當前的變數和形參暫時保留起來,在新一輪的呼叫過程

中,系統為新呼叫的函式所用到的變數和形參開闢另外的存 儲單元(記憶體空間)。每次呼叫函式所使用的變

量在不同的記憶體空間。

1.3.2、遞迴呼叫的層次越多,同名變數的占用的儲存單元也就越多。一定要記住,每次函式的呼叫,系統都會為該函式的變數開闢新的記憶體空間。

1.3.3、當本次呼叫的函式執行結束時,系統將釋放本次呼叫時所占用的記憶體空間。程式的流程返回到上一層

的呼叫點,同時取得當初進入該層時,函式中的變數和形參 所占用的記憶體空間的資料。

1.3.4、所有遞迴問題都可以用非遞迴的方法來解決,但對於一些比較複雜的遞迴問題用非遞迴的方法往往使

程式變得十分複雜難以讀懂,而函式的遞迴呼叫在解決這類 問題時能使程式簡潔明瞭有較好的可讀性;但由

於遞迴呼叫過程中,系統要為每一層呼叫中的變數開闢記憶體空間、要記住每一層呼叫後的返回點、要增加許

多額外的 開銷,因此函式的遞迴呼叫通常會降低程式的執行效率。

1.4、遞迴函式的優缺點:

1.4.1、缺點:

遞迴快速耗記憶體

不方便閱讀和維護

效率低1.4.2、優點:

簡潔適合解決階乘、涉及相反順序的程式設計問題

1.5、遞迴函式例項:

// 函式 binarysearch() 在排序好的陣列中搜尋

// 引數:需要搜尋的元素值;待搜尋的long型別陣列;陣列的長度

// 返回值:指向滿足搜尋條件的元素的指標,或者為null,如果陣列中沒有元素滿足搜尋條件。

long *binarysearch( long val, long array[ ], int n )

在例 子 中,遞迴函式 binarysearch()實現二元搜尋演算法,在排序好的陣列中找到特定元素。首先,該函式根據搜尋條件比較陣列最中間的元素。如果相同,就返問該元素的指標,表示找到了;如果不相同,該函式會呼叫自己,在可能存在滿足搜尋條件的一半陣列中搜尋,一直遞迴地進行下去,指導找到滿足搜尋條件的元素。如果剩下陣列的長度為 0,則表示找不到,那麼遞迴就會結束。

對於有 n 個元素的陣列來說,二元搜尋演算法進行最多 1+log2(n)次比較。如果有一百萬個元素,最多比較 20 次,也就是最多 20 次遞迴執行函式 binarysearch()。

遞迴函式基於了這樣乙個事實:每次呼叫函式時,都會重新建立動態變數。這些變數,以及返回時需要的呼叫者位址,都儲存在棧中,每次函式遞迴都會造成棧上新增一塊資料。程式設計師要確保棧的空間夠大,足以容納遞迴的中間處理過程。不過例 1 中的函式 binarysearch()對於棧空間的要求並不大。

c語言中錯誤提示(持續更新)

錯誤型別 多報錯是好事 一 warning 二 error 三 linux命令 1 warning warning assignment makes integer from pointer without a cast enabled by default 賦值型別和變數型別不一致 warning...

C語言寶典(持續更新)

正確操作 錯誤操作 編譯時報錯 double rate const double locked const double pc rate 可以 pc locked 可以 const double locked double pc locked 不可以 1 str1 str2 str5都指向了同乙個字...

C語言中實用的子函式(持續加料)

函式的作用 c語言中的函式的作用是可以將一段經常需要使用的 封裝起來,在需要使用時可以直接呼叫。一,判斷素數 int prime int m k int sqrt m 減少執行時間 for i 2 i k i return 1 二,計算乙個非負整數組成它的每位數的數字之和 int digit sum...