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和#2相當於迴圈體,當符合測試條件(即n<4)時,#1部分迴圈;當測試條件為false時,#2部分迴圈。
- 在遞迴函式中,位於遞迴呼叫之前的語句(即#1部分),按被調函式(即recur())的順序執行;位於遞迴呼叫之後的語句(即#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)