1. 程式人生 > >C語言學習總結(1)-遞迴函式的理解

C語言學習總結(1)-遞迴函式的理解

啥是遞迴?

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

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

案例

#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,歡迎大神們指正。微笑

相關推薦

C語言學習總結1-函式理解

啥是遞迴? 即是該函式呼叫它本身自己,這種呼叫過程稱為遞迴。 遞迴可以相當於迴圈,所以想結束遞迴,就必須有終止遞迴的條件測試部分,否則就會出現無限遞迴(即無限迴圈)。同時,這也是使用遞迴的難點

C語言學習總結——C函式總結

C 庫函式主要指那些由美國國家標準協會(ANSI)或國際標準化組織(ISO)釋出的標準中規定的庫函式,按照標準 C 的要求來進行 C 語言程式設計是很重要的,因為這樣你的程式碼才有可能跨平臺使用。 最早的 C89 中有15個標準標頭檔案: asse

C語言經典演算法——實現二分查詢的兩種方法

後繼續整理演算法並寫出自己的理解和備註。 C++實現的:遞迴實現二分查詢演算法 1、 遞迴實現二分查詢 <1> 題目描述:針對資料,進行二分查詢(要求:資料的排列有序) <2> 方法一:概念法 <3> 方法二:遞迴法 原始碼: 一、 遞迴實現

C語言經典演算法——實現斐波那契數列的兩種方法

後繼續整理演算法並寫出自己的理解和備註。 C++實現的:遞迴實現斐波那契數列 1、 遞迴實現斐波那契數列Fib(n) <1> 題目描述:輸入n值,求解第n項的斐波那契數列值 <2> 方法一:概念法 <3> 方法二:遞迴法 斐波那契數列值是值1

C語言經典演算法——實現階乘演算法的兩種方法

今後繼續整理演算法並寫出自己的理解和備註。 C++實現的:遞迴實現階乘演算法N! 1、 遞迴實現n! <1> 題目描述:輸入n值,求解n的階乘 <2> 方法一:累乘法 <3> 方法二:遞迴法 原始碼: 一、 遞迴實現n! 1、 累乘法 #

C語言學習筆記5—— 語句1

  c程式常見結構大概有選擇結構,迴圈結構,順序結構。c程式由一個一個的函式構成,而構成函式的則是語句,語句包含賦值語句,迴圈語句,條件語句,分支語句。賦值語句對與我們來說是很熟悉的。條件語句,分支語句與迴圈語句則會在後面一一介紹到。   順序結構對於我們來說是很熟悉的,它可以是這個樣子。 &nbs

C語言學習筆記—— 函式和指標

一、函式1、一個簡單的函式示例函式是完成特定任務的獨立程式程式碼單元。#include <stdio.h> void printStar();//宣告函式原型,函式原型會指明函式的型別和函式接受的引數。前面的void是函式型別,表明函式沒有返回值 #define

c 語言學習筆記基礎

lac alert https 內容 con 標記 prime c++ prime c基礎 近期工作上有對C語言算法上的需求,所以要學C,上學的時候沒學過,只學過半年的Java(我是專升本,本科學的材料),2015年工作後也學過C,那時候的需求是能看懂就可以,也就沒深入研究

C語言學習系列C語言基本語法和數據類型

.html 二進制 占用 efault html pac 精度 es2017 %d 一、基本語法 C的令牌(Tokens)   C 程序由各種令牌組成,令牌可以是關鍵字、標識符、常量、字符串值,或者是一個符號。 關鍵字(保留字) auto else long swit

C語言學習系列存儲類

amp 限制 () 存儲 col print strong .com 學習 一、C存儲類 存儲類定義C程序中變量/函數的範圍(可見性)和生命周期。這些說明符放置在他們所修飾的類型之前。for example:auto、register、static、extern。 (一)、

C語言學習系列基本語法

xor 12px 左移 程序 str 繼續 p s type false 一、C運算符 算術運算符(語法和java類似或基本一樣略過不再描述) 關系運算符(略) 邏輯運算符(略) 位運算符 運算符描述實例 & 如果同時存在於兩個操作數中,二

MEF學習總結1---總體架構

attr 總結 技術分享 dir target get gre round 管理 用了很久的MEF框架來做依賴註入,最近想把它的原理和機構總結一下,主要包括如下幾個方面: 1. 總體架構 2. .Net Composition Primitive 3. Attribu

Go語言學習筆記1——順序編程

寫法 AR [] 多重賦值 返回值 賦值 表達 div long Go語言學習筆記這一堆主要是《Go語言編程》(人民郵電出版社)的讀書筆記。中間會穿插一些零碎的點,比如源碼學習之類的。大概就是這樣吧。 1. 順序編程 1.1 變量 變量的聲明: var 變量名 類型 va

Spring-Batch學習總結1——重要概念,環境搭建,名詞解釋,第一個項目及異常處理

img truct 設定 uil sna sta col key services Spring-batch框架學習總結(1)一.初識Spring-batch框架:1.核心名詞解釋:Job:是Spring-batch框架的核心概念,它包含了批處理的所有操作Step:每一個J

phthon學習總結1

pytho 保留字 大小寫 特殊字符 int 開頭 字母數 操作 定義 1、print("hello word") 2、變量、常量:   變量是存儲信息、方便調用、修改操作   常量固定不變的量,python用字母大寫區分。無常量。 命名規則: 1)字母數字下劃線組成。 2

C語言學習筆記4—— 數據類型的使用

循環小數 強制類型轉換 進行 代碼 size 圖片 unsigned 問題 d+  在程序設計語言裏,我們會把數據分為各種各樣的類型,為什麽會有數據類型之分呢?計算機中,所有的數據都會表示成二進制數的形式,對於同樣的一個二進制數,數據類型不同,它表示的數據就是不同的。也就是

Redis學習總結1——Redis記憶體資料庫詳細教程

1.Redis是什麼 2.redis的作者何許人也 3.誰在使用redis 4.學會安裝redis 5.學會啟動redis 6.使用redis客戶端 7.redis資料結構 – 簡介 8.redis資料結構 – strings 9.redis資料結構 – lists 10.redis

C語言學習筆記5—— 語句2

  在介紹過順序結構和選擇結構以後,我們能通過c語言做的事依舊很少,比如換硬幣問題。將一元的人民幣換成一分,兩分,五分的硬幣共50枚。如何解決這樣的問題呢?我們可以把它化解成一個求解線性方程組的問題。   可以設需要一分的硬幣x枚,兩分的硬幣y枚,五分的硬幣z枚。於是,我們可以得到一個方程組,像這樣:x+y

[學習總結] python語言學習總結

用py也很久了,很多東西只知道拿來用,並沒有深究,感覺這樣是不夠的。 我決定寫這麼一篇總結,把很多遺忘的東西拾起來,把很多沒搞懂的東西搞清楚。 1.eval函式 用法:eval(expression, globals=None, locals=None) 解釋:將字串str當成有效的表

[學習總結] python語言學習總結

1.python中的拆包 之前就只寫了*可以是未知數量的引數,**可以傳入未知數量命名引數。這次詳細記下拆包。 def f1(a, *l): print(a) # 不拆包 print(l) # 拆包 print(*l) f2(l)