知識點:
1.函數基礎
2.函數參數和返回值
3.形參和實參,變量的類型
4.函數聲明
5.函數遞歸算法
==========================
1、函數基礎數組
函數的做用:封裝一個經常使用的功能app
定義函數的步驟:函數
1>明確函數的做用,起一個有意義的名稱spa
2>肯定函數的參數:想清楚調用函數的時候是否須要傳入外界的一些數據code
3>肯定函數的返回值:想清楚函數調用完畢後是否須要返回一個值給函數調用者blog
1.函數的定義格式遞歸
返回值類型 函數名(參數列表)生命週期
{ci
函數體
}
(1)功能函數
// 函數能夠沒有形參
play() { // 在這個大括號裏面說清楚函數是幹啥(裏面包含了什麼代碼) printf("播放了MP3\n"); }
(2)返回值,參數
形參:定義函數的時候,函數後面()中的變量
實參:調用函數的時候,傳進去的值
#include <stdio.h>
double average(int v1, int v2) // 變量v一、v2稱爲「形式參數」,簡稱「形參」。 ()中的內容能夠稱爲「形參列表」 { // 計算平均數 double result = (v1 + v2)/2.0; // return的2個做用 // 1.退出函數 // 2.將右邊的值返回給函數調用者 return result; } // 任何C語言程序默認狀況下,只會執行main函數 int main() { // 調用函數 play(); // 調用average函數 double d = average(10, 20); double d1 = average(30, 40); printf("d1 is %f\n", d1); return 0; }
建議:
之後儘可能把經常使用的代碼\功能封裝到一個函數裏面去,這樣能夠提升代碼重用率,能夠提升可擴展性
2.函數做用
1)使程序結構清晰簡潔
2)部分代碼重複利用下降代碼冗餘
3)獨立的工做內容和模塊
3.函數的分類
使用角度分類:
API application programe interface
ASCII C89 C99 C11
1)標準c庫函數,由系統實現好的一些列功能函數
如:printf, scanf, fabs, labs…
除c庫之外的函數稱爲第三方函數
2)用戶自定義函數,由用戶自定義的功能函數
從函數形式分類:
1)無參函數 void
2)有參函數
3)有返回值 對應類型
4)無返回值 void
4.函數說明
1)一個程序有若干個文件,每一個文件有若干個函數組成
2)c程序由main函數開始,也從main函數結束
3)源程序中的全部函數在結構上是平行的,互相獨立的
4)main函數能夠調用其餘函數,函數之間能夠相互調用
===========================
函數參數和返回值
2)調用過程當中實參和形參
3.若是沒有參數時通常將參數列表置空
沒有參數時,參數列表通常填寫void
3.return 做用分析
1)當函數須要有返回值的時候,用來將結果返回
2)思考:若是函數沒有明確返回值的時候,是否能夠使用? 見上得功能函數
3)return 的另一個做用是提早結束該函數,而且返回到函數調用者處,return後的代碼不會被執行
===========================
形參和實參關係
1.例子:交換兩數
2.參數傳遞的方式和過程
1)值傳遞
2)地址傳遞
===========================
全局變量和局部變量
全局變量:共享數據
1.變量的分類
1)函數參數和內部變量稱爲局部變量
2)在函數外部的變量稱爲全局變量
2.做用域,生命週期(變量有效範圍)
1)局部變量的做用域爲當前函數,從變量開始到函數結束
2)全局變量的做用域爲全部文件,從變量開始到程序結束
3.生命週期(變量的有效時間)
1)只在函數運行期間有效,一旦函數執行完畢後,變量將會被系統銷燬
2)全局變量在整個程序運行期間有效,直到程序退出纔會被系統銷燬
4.參數屏蔽
局部變量屏蔽全局變量
局部變量和全局變量的變量名一致
===========================
函數聲明
1.函數聲明的做用
1)讓調用者知道如何調用
2)讓編譯器在編譯階段判斷函數調用是否正確
思考:函數聲明是否有必要?若是沒有聲明會如何(從參數和返回值方面思考)
2.聲明方式
聲明瞭函數的名字,參數個數和類型,返回值類型
===========================
函數遞歸
例子:從前有座山…
1.什麼是遞歸
函數調用自身的過程
2.遞歸做用
遞歸常常被用於解決計算機科學的問題。
3.應用場合
(1)數據的定義是按遞歸定義的。(Fibonacci函數)
(2)問題解法按遞歸算法實現。(回溯)
(3)數據的結構形式是按遞歸定義的。
(樹的遍歷,圖的搜索)
4.實例:
1)計算1+2+3+…+n
練習:1.用函數遞歸計算1*2*3*…*n的值
2.用函數遞歸輸入10進制,輸出2進制 1010
2)用函數遞歸計算斐波那切數列
1>示例:經過循環實現斐波那切數列
2> 經過遞歸實現
5.遞歸缺點
1)遞歸算法解題相對經常使用的算法如普通循環等,運行效率較低。
所以,應該儘可能避免使用遞歸,除非沒有更好的算法或者某種特定狀況比
遞歸更爲適合的時候。
2)在遞歸調用的過程中系統爲每一層的返回點、局部量等開闢了棧來存儲。
遞歸次數過多容易形成棧溢出等。
補充:
// 終端上用control+x能夠退出死循環
// 函數調用本身自己可能會出現死循環
// 函數調用本身自己,稱爲「遞歸」