啥是遞迴?

即是該函式呼叫它本身自己,這種呼叫過程稱為遞迴。

遞迴可以相當於迴圈,所以想結束遞迴,就必須有終止遞迴的條件測試部分,否則就會出現無限遞迴(即無限迴圈)。同時,這也是使用遞迴的難點。

案例

#include <stdio.h>
void recur(int);
int main (void)
{
	recur(1);
	return 0;
}
void recur(int n) //遞迴函式
{
	printf("第%d級呼叫\n", n); //#1
	if (n < 4)
	{
		recur(n+1); //遞迴
	}
	printf("第%d級返回\n", n); //#2
}
  • 輸出結果:
.
第1級呼叫
第2級呼叫
第3級呼叫
第4級呼叫
第4級返回
第3級返回
第2級返回
第1級返回
  • 解析:
  1. 從結果可以看出,#1和#2相當於迴圈體,當符合測試條件(即n<4)時,#1部分迴圈;當測試條件為false時,#2部分迴圈。
  2. 在遞迴函式中,位於遞迴呼叫之前的語句(即#1部分),按被調函式(即recur())的順序執行;位於遞迴呼叫之後的語句(即#2部分),按被調函式相反的順序執行。
  3. 每級函式呼叫都有自己的變數,遞迴呼叫就相當於又從頭開始執行函式的程式碼。
  4. 每次函式呼叫都會返回一次,並且按順序逐級返回遞迴。

遞迴(優缺點)與迴圈

  • 使用迴圈的地方都可以使用遞迴
  • 缺點:
  1. 遞迴快速耗記憶體
  2. 不方便閱讀和維護
  3. 效率低
  • 優點:
  1. 簡潔
  2. 適合解決階乘、涉及相反順序的程式設計問題

尾遞迴

正好在return語句之前。
尾遞迴是最簡單的遞迴形式,因為它相當於迴圈。
從遞迴函式中,可以隱約的知道所有的C函式皆平等,即是你可以呼叫我,我可以呼叫你。
PS:這是Xzhi本人第一次寫部落格大笑,寫部落格的目的是與他人分享自己學習的心得,同時是對學習的總結與記錄,此文章中若存在bug,歡迎大神們指正。微笑