遞歸函數和預處理學習總結
遞歸學習心得:
遞歸即是該函數調用它本身自己,這種調用過程稱為遞歸。
遞歸可以相當於循環,所以想結束遞歸,就必須有終止遞歸的條件測試部分,否則就會出現無限遞歸(即無限循環)。
遞歸就是某過程以某種方式重復出現,很多“計算”也以某種方式重復出現。
例如:
數學歸納法中的遞歸:證明一個與自然數n有關的命題P(n),有如下步驟:
(1)證明當n取第一個值n0時命題成立(n0對於一般數列取值為0或1)
(2)假設當n=k(k≥n0,k為自然數)時命題成立,證明當n=k+1時命題也成立。
遞歸(優缺點)與循環
使用循環的地方都可以使用遞歸
缺點:
遞歸快速耗內存
不方便閱讀和維護
效率低
優點:
簡潔
適合解決階乘、涉及相反順序的編程問題
函數的遞歸調用
在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸調用。
遞歸有直接遞歸和間接遞歸
用遞歸法求解問題時的方法:
列出遞歸方程/思路
寫出遞歸函數
調用遞歸函數
遞歸經典的問題漢諾塔問題
程序設計分析:用f(n, a, b, c)表示要求解的問題,其含義是有a、b、c三根棒和n只盤,且這n個盤疊放在a棒上,依次疊放為大盤在下,小盤在上。借助b棒將n只盤從a棒移到c棒上。每次只移一個盤,在移動時保持大盤在下,小盤在上。這個問題理解的時候對我來說還是挺有難度的 預處理學習總結 預處理是指在系統對源程序進行編譯之前,對程序中某些特殊的命令行的處理,預處理程序將根據源代碼中的預處理命令修改程序。使用預處理功能可以改善程序的設計環境,提高程序的通用性、可讀性、可修改性、可調試性、可移植性和方便性,易於模塊化。
C語言中以符號"#"開頭的命令
(1)宏定義:#define...
(2)文件包含:#include...
(3)條件編譯:#ifdef...
宏就是替換,其分兩類:簡單的字符替換和帶參數的宏替換。
宏定義語法:#define 標識符字符串應用法則:原樣替換
典型應用:符號常量
典型錯誤:#definePI3.1415926;
帶參數的宏定義
語法:#define宏名(參數表)字符串
例如
#defineS(a,b)a*b,其中a、b為宏的參數
“文件包含”處理
所謂“文件包含”處理是指一個源文件可以將另外一個源文件的全部內容包含進來。
“文件包含”命令的作用:
“文件包含”命令可以節省程序設計人員的重復勞動
將常用的一組固定常量的定義組成一個文件——方便,易修改
庫函數的開發者將對被調用的函數的原型聲明寫入頭文件,程序員只需
要#include<頭文件>——大大簡化了程序
一行#include,相當於寫幾十、幾百,甚至更多行的內容
“文件包含”是模塊化程序設計的產物
便於多個程序員分別編程
將公用的符號常量或宏定義等可單獨組成一個文件,在其它文件的開頭
用包含命令包含該文件即可使用
公用的聲明只寫一次,除節省時間,更可觀的是減少出錯
格式1:#include文件名
格式2:#include"文件名"
(2)功能:用指定的文件名的內容代替預處理命令。
(3)兩種格式的區別:
格式1定義時,預處理程序在C語言編譯系統定義的標準目錄下查找指定的文件。
格式2定義時,預處理程序首先在引用被包含的頭文件的源文件所在的目錄中尋找指定的文件,如沒找到,再按系統指定的標準目錄查找。
為了提高預處理程序的搜索效率,通常對用戶自定義的非標準文件使用格式2,對使用系統庫函數等標準文件使用格式1.
條件編譯
一般情況下,在進行編譯時對源程序中的每一行都要編譯。
條件編譯:希望根據需要只編譯程序中某一部分
條件編譯命令常用在對程序的調試中。
//define標識符
#ifdef標識符
程序段1
#else
程序段2
#endif
當所指定的標識符已經被#define
命令定義過,則在程序編譯階段
只編譯程序段1,否則編譯程序段
2。#endif用來限定#ifdef命令
的範圍,其中#else部分也可以沒
有。
#ifndef標識符
程序段1
#else
程序段2
#endif
條件編譯的常用形式之二
#if常量表達式
程序段1
#else
程序段2
#endif
如常量表達式的值為真(非
0),則對程序段1進行編譯,
否則對程序段2進行編譯。因
此可以使程序在不同條件下,
完成不同的功能。
遞歸函數和預處理學習總結