C語言(長期更新)
第8講:函數遞歸
????跟著潼心走,輕松拿捏C語言,困惑通通走,一去不回頭~歡迎開始今天的學習內容,你的支持就是博主最大的動力。
目錄
C語言(長期更新)
第8講
函數遞歸
知識回顧
?前言
8.1 什么是遞歸
8.1.1 where——啥時候用
8.1.2 how——怎么用
8.1.3 what——具體含義
8.2 遞歸實例1:計算階乘
8.2.1分析與代碼實現
8.2.2 畫圖分析
8.3 遞歸實例2:順序打印一個整數的每一位
8.3.1分析與代碼實現
8.3.2 畫圖分析
知識回顧
上節課我們學習了一些VS實用的調試技巧,今天我們來學習函數遞歸的內容,坐穩了,我們發車,gogogo!
?前言
我們在先前解決問題時常常會用到循環來解決一些重復的操作,往往寫代碼時需要寫很多行代碼。今天我們來介紹一種全新解決問題的方法——函數遞歸(Recursion)
8.1 什么是遞歸
遞歸就是函數自己調用自己
舉個🌰
比如上面的代碼,在main函數中調用main函數,導致main函數無限調用,無限次打印"hehe"
運行一段時間后,彈出報錯警告,我們看到報錯信息中有一個stack overflow,就是棧溢出的意思。為什么會這樣捏?因為每次main函數的運行都需要在內存中開辟空間,空間不夠用了就造成棧溢出了。
上面是函數遞歸的錯誤使用,只是為了方便說明,下面我們就來詳細介紹一下函數遞歸
8.1.1 where——啥時候用
函數遞歸常用于將一個大規模的問題轉化為規模較小的同類子問題,直至問題不可繼續拆解
這種大化小的思想賦予了函數遞歸常常以幾行簡單代碼就能解決復雜問題的特性
8.1.2 how——怎么用
- 函數遞歸是有限制條件的,達到限制條件終止遞歸
- 每次遞歸都會逼近這個限制條件,以避免棧溢出
8.1.3 what——具體含義
遞歸二字遞為遞推,歸為回歸
8.2 遞歸實例1:計算階乘
8.2.1分析與代碼實現
我們知道一個數字的階乘(Factorial)就是從1乘到這個數的積。可我們也可以換一種思路
你想,1!=1,2!=1*2=1!*2,...依此類推可得 n!=(n-1)!*n
唉,這不就遞歸了嗎,算一個數的階乘被轉化為算比他小1的數的階乘,比他小1的結成有轉化為哦算比他小2的數的階乘。以大化小,妙哉!
下面我們寫代碼
8.2.2 畫圖分析
先逐層函數遞歸,將大的問題拆解,層層深挖,推至無處可推,在逐層回歸問題,一步一步將值代入,這就是遞歸。
8.3 遞歸實例2:順序打印一個整數的每一位
8.3.1分析與代碼實現
給一個數我們最容易得到的就是這個數的個位
想要拿到最高位的數字最容易想到的辦法就是一層一層剝下來。每次除以10剝取最后一位,再取余
每一次都是對取過余的數做除以10的操作這就是重復性的同類子問題,因此我們可以使用遞歸
下面我們寫代碼
8.3.2 畫圖分析
?? ?好了今天的學習內容就到這里啦,謝謝你的陪伴,我是潼心,下次再見~如果這篇文章對你有幫助的話。請務必給主播一個一鍵三連,球球了,這對主播很重要~