傳智播客:兩張圖看懂C語言當中的巢狀、遞迴呼叫

在C語言當中,大家都一致認為函式和指標部分的內容比較,並且是C語言裡面很重要的基本組成元素。一個完整的應用程式是不可能在一個函數里面實現所有我們想要的功能。通常程式都是由很多的功能而且不同的函式功能來實現。並且在函式之間會存在互相呼叫的情況。本篇文章就針對函式的呼叫方式、巢狀呼叫和遞迴呼叫進行詳細地講解。

函式的呼叫方式

函式在C語言當中的作用眾所周知,如果我們想要實現函式的功能,就必須要學會的是正確的使用或者是呼叫函式。在C語言裡面,呼叫函式的具體語法的格式如下:

函式名([[實參列表1],[實參列表2],。。。])

我們可以從上一行的各市裡面看出來,在我們呼叫一個函式的時候,需要明確函式的名字和實參列表。實參列表當中的引數可以是常量、變數、表示式或者是空的,各個引數之間使用的是

英文逗號分割。

根據函式在程式中出現的位置,可以有下面三種函式的呼叫方式:

(1)將函式作為表示式呼叫

首先函式作為表示式呼叫的時候,函式的返回值是參與表示式的運算的,這個時候要求函式是必須有返回值的。示例程式碼看下面:

int ret1 = max(100, 150);

(2)把函式作為語句呼叫

函式以語句的形式出現的時候,我們可以把函式作為一條語句來呼叫。示例程式碼:

printf(“Hello, world!\n”);

(3)將函式作為實參呼叫

將函式作為另外一個函式的實參的時候,那麼要求這個函式是要有返回值的。如下:

printf(“%d\n”, max(100, 150));

在上面的語句當中,將函式max()的返回值當做printf()函式的實參來使用

巢狀呼叫

在C語言當中函式的定義一定是獨立的,及時一個函式不可以定義在另一個函式的內部,但是在呼叫函式的時候,可以在一個函式中呼叫另外的一個函式。這是函式的巢狀呼叫。我們透過一個案例來演示一下函式的巢狀呼叫:

傳智播客:兩張圖看懂C語言當中的巢狀、遞迴呼叫

上面這27行程式碼所出現的執行結果如下圖:

傳智播客:兩張圖看懂C語言當中的巢狀、遞迴呼叫

在上面的例子中, main()函式中呼叫了max4()函式,那麼max4()函式又呼叫了max2()的函式。我們都知道程式設計最重要的就是思維。下面我們透過一張流程圖更好的理解一下這個執行過程:

傳智播客:兩張圖看懂C語言當中的巢狀、遞迴呼叫

我們來解釋一下這個步驟:

首先是執行main()函式的開頭部分

當遇到了函式呼叫語句,呼叫的max4()函式,流程就會轉向max4()函式的入口

之後是執行max4的函式開頭的部分

遇到了函式呼叫語句,之後呼叫了max2()函式,流程這個時候轉向max2()函式入口

執行了max2()函式,如果再無其他的巢狀函式,就會完成max2()函式的全部操作了

這時候會返回到max2()函式中呼叫max4()的函式位置

從而繼續執行max4()的函式中還沒有執行的部分,一直到max4()函式的結束

返回main()函數里呼叫max4()函式的位置

這時候繼續執行main()函式的剩餘部分一直到結束

傳智播客:兩張圖看懂C語言當中的巢狀、遞迴呼叫

3.遞迴函式

在數學當中,會遇到計算多個聯絡自然數之和的情況。比如說我們要計算1~n之間的自然數的和,那麼就需要先計算1+2的結果,然後再去+3,從而再次得到一個結果+4,以此類推,一直到1~(n-1)之間所有的數的和+n。

在程式裡面,想要完成上面的功能,這裡就需要用到的是函式的遞迴呼叫了。所謂的遞迴呼叫也就是函式內部呼叫自身的過程。這裡要注意的是,遞迴的話必須要求有結束條件的,不然就會陷入無限遞迴的迴圈當中,最後無法結束呼叫。下面還是透過剛剛說的自然數相加之和的例子,學習一下遞迴呼叫:

傳智播客:兩張圖看懂C語言當中的巢狀、遞迴呼叫

上面16行程式碼所出的結果為:

傳智播客:兩張圖看懂C語言當中的巢狀、遞迴呼叫

這裡呢我們定義了一個getsum()函式用在計算1~n之間自然數的和。在上面程式碼中的第9行,我們可以理解成getsum()這個函式的內部呼叫了自身,這就是函式的遞迴。在這個過程裡面n==1的時候結束。這個過程很複雜,但是也很重要,為了我們可以弄明白整個過程,我們按照執行過程總結一下呼叫:

傳智播客:兩張圖看懂C語言當中的巢狀、遞迴呼叫

這裡描述了遞迴呼叫的過程,在這個遞迴的過程裡面getsum()函式被呼叫了4次,每次呼叫的時候,n的值都會遞減的。在n的值等於1的時候,所有的遞迴呼叫函式都會以相反的順序來相繼的結束,所有的返回值會進行累加,最後我們得到的結果是0。

以上就是函式呼叫的全部內容。下一篇文章我們會分享外部函式與內部函式。