【宏思微想:科技生活,技術開發】
定義:函數直接或間接的調用自己,叫做遞歸函數。
特點:
1. 直接或間接調用函數自身。
2. 必須有終止執行的條件,即遞歸終止的條件被滿足後,則不再調用自身函數。
3. 如果不滿足終止執行的條件,則調用涉及遞歸調用的表達式。在調用函數自身時,有關終止條件的參數要發生變化,而且需向遞歸終止的方向變化。
遞歸函數的寫法?
1. 普通遞歸
以階乘為例:
int Factorial(int n)
{
if(0==n || 1==n)
return 1;
else
return n * Factorial(n-1);
}
2. 尾部遞歸:遞歸函數最後一件事情是做遞歸調用。普通遞歸改為尾部遞歸的常見方法是將當前的運算結果傳入下一次遞歸中。
以階乘為例:
int Factorial(int n, int update)
{
if(0==n || 1==n)
return update;
else
return Factorial(n-1, n*update);
}
遞歸函數的優點?
邏輯清晰,代碼簡潔。
遞歸函數的缺點?
1. 效率較低。反覆調用函數,壓棧出棧,時間開銷上會有所遞增。
2. 棧開銷大,容易爆棧。每一次遞歸調用都會分配新的棧空間,所以棧的開銷會隨著遞歸的次數而遞增。解決辦法是使用尾部遞歸。尾部遞歸在調用遞歸函數時,當前函數的棧已不需要,可直接釋放掉,因此尾部遞歸函數可以在固定大小的棧中執行。但這需要編譯器的棧管理支持對尾部遞歸的這種優化。
遞歸函數的常用場合?
數學運算,工程運算等一切可抽象歸納出規律性的場合。理論上,循環和遞歸可以相互轉化。
——————(完)——————
相關推薦
'C語言定義無參數的函數時,f()和f(void)有什麼區別?'
"相信C語言初學者常會在前輩留下的項目,或者一些開源項目中看到以 void 作為參數的函數,例如 void fun(void),雖然我們都明白在C語言中,“void”表示空,但是按理說,如果函數不需要參數,直接空著就行:void fun(),為什麼還要多此一舉的寫上 voi...
'現在這麼多編程語言可學,為什麼還要學那麼舊的C語言?有用嗎?'
"編寫操作系統最常用的編程語言就是C語言了。用C語言編寫的第一個操作系統是 Unix,之後的 GNU/Linux 等操作系統也都是使用C語言編寫的。編寫操作系統最常用的編程語言就是C語言了C語言不僅僅是操作系統語言,也是當今幾乎所有流行的高級編程語言的先驅,這些編程語言多多...
'許多高級編程語言都借鑑了C語言的架構,或者乾脆就是C語言編寫的'
"編寫操作系統最常用的編程語言就是C語言了。用C語言編寫的第一個操作系統是 Unix,之後的 GNU/Linux 等操作系統也都是使用C語言編寫的。編寫操作系統最常用的編程語言就是C語言了C語言不僅僅是操作系統語言,也是當今幾乎所有流行的高級編程語言的先驅,這些編程語言多多...
'萬能的C語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?'
"使用C++開發過程序時,定義函數可以指定默認參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數默認第二個參數等於 3,例如 f(1) 就相當於 f(1,3)。這是一個很好用的特性,那麼在C語言...
'既然C語言無所不能,那麼它也能定義帶“默認參數”的函數嗎?'
"使用C++開發過程序時,定義函數可以指定默認參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數默認第二個參數等於 3,例如 f(1) 就相當於 f(1,3)。這是一個很好用的特性,那麼在C語言...
'各編程語言出生簡介:C語言竟是因為無聊產生,那你心中的它呢?'
"編程語言有上千種,但是流行的不過10來種,那些我們經常使用的編程語言都是誰在什麼時候創造出來的呢?一起來看看。1880年約瑟夫·瑪麗·雅卡爾設計出人類歷史上首臺可設計織布機--雅卡爾織布機,對將來發展出其他可編程機器(例如計算機)起了重要作用。當時,他的發明受到了Skyn...
'一個資深C語言工程師:淺說C語言的重要性以及如何學好C語言'
"前言C語言屬於高級程序語言的一種,它的前身是“ALGOL”。其創始人是布朗·W·卡尼漢和丹尼斯·M·利奇。C語言問世時是帶有很大的侷限性,因為它只能用於UNIX系統上。然而隨著科學技術的進步,計算機工業的發展,C語言逐漸脫離UNIX。1987年美國標準化協會制定了C語言的...
'C語言快速入門——指針與數組'
"與數組有關的地址我本來打算以一個程序開始,讓我們直接理解相關概念。但轉念一想,如果引導你思考問題而得出結論,或許會有另一種效果,因此,我們的討論以下面的定義為基礎。int a = 9;int b[3] = { 0, 1, 2 };程序中定義的每個變量都對應一個具體的地址。...
推薦中...