【C語言】函數遞歸詳解(一)

目錄

1.什么是遞歸:

1.1遞歸的思想:

1.2遞歸的限制條件:

2.遞歸舉例:

2.1舉例1:求n的階乘:

2.1.1 分析和代碼實現:

?2.1.2圖示遞歸過程:

2.2舉例2:順序打印一個整數的每一位:

2.2.1分析和代碼實現:

2.2.2圖示遞歸過程:


1.什么是遞歸:

?遞歸是學習C語言函數繞不開的一個話題,那什么是遞歸呢
?遞歸其實是一種解決問題的方法,在C語言中,遞歸就是函數自己調用自己。

寫一個簡單的C語言遞歸代碼:

#include<stdio.h>
int main()
{printf("hehe\n");mian();return 0;
}

上述就是一個簡單的遞歸程序,只不過上面的遞歸只是為了演示遞歸的基本形式,不是為了解決問題,代碼最終會陷入死遞歸,導致棧溢出(Stack overflow)。

?棧溢出的原因:

?我們每次調用printf()函數時都會在棧區開辟一塊空間,因為上述代碼會死遞歸,所以會一直調用printf()函數,但是棧區的空間是有限的,當棧區滿了之后我們再調printf()函數時,系統想繼續分配空間此時就會棧溢出(Stack overflow)。

1.1遞歸的思想:

把一個大型復雜的問題層層轉化為一個與原問題相似,但規模較小的子問題來求解;直到子問題不能再被拆分,遞歸就結束了。所以遞歸過程就是把大事化小的過程

遞歸中的遞就是遞推的意思,歸就是回歸的意思,接下來慢慢體會 。

1.2遞歸的限制條件:

遞歸在書寫的時候,有2個必要條件:

1.遞歸存在限制條件,當滿足這個限制條件時,遞歸便不再繼續。

2.每次遞歸調用之后越來越接近這個限制條件。(漸漸停下來)

在下面的例子中,我們會逐步體會這兩個限制條件

2.遞歸舉例:

2.1舉例1:求n的階乘:

階乘(factorial):一個正整數的階乘是所有小于等于該數的正整數的積,且0的階乘為1,

自然數n的階乘寫作n!

2.1.1 分析和代碼實現:

以5!為例子我們進行分析

5!=5*4*3*2*1????????=????????5*4!

4!=?? 4*3*2*1????????=????????4*3!

3!=????? 3*2*1????????=????????3*2!

2!=????????? 2*1????????=????????2*1!

1!=???????????? 1????????=????????1*0!

0!=1

通過觀察5!我們可以發現當n>0時,n!=n*(n-1)!,當n=0時,n!=1。

如下圖所示:

?

?因此我們可以定義求n!函數為Fact(n),當n>0時,Fact(n)=n*Fact(n-1),當n=0時,Fact(n)=1。

代碼實現如下:

#include<stdio.h>
int Fact(int n)
{if (n > 0) {return n * Fact(n - 1);}else{return 1;}
}
int main()
{int n = 0;scanf("%d", &n);int ret = Fact(n);printf("%d", ret);
}

運行結果如下:

?2.1.2圖示遞歸過程:

2.2舉例2:順序打印一個整數的每一位:

輸入一個整數m,按照順序打印整數的每一位

例如:

輸入:1234??????????????? 輸出:1 2 3 4

輸入:520????????????????? 輸出:5 2 0

2.2.1分析和代碼實現:

這個題目,放在我們面前,首先想到的是,怎么得到這個數的每一位呢?

如果n是一位數,那么取出的數字就是它本身,如果n超過一位數(即n>9),就需要拆分每一位。

例如1234:

1234%10得到4,1234/10得到123,相當于去掉了4,繼續對123%10得到3,123/10得到12,以此類推,不斷重復%10/? 10的操作,直到1234的每一位都得到;但是我們按照此方法得到的不是1 2 3 4而是倒著的4 3 2 1.

那么我們可以這么想,每一個數字的最低位置是最容易得到的,通過%10就可以得到

我們設想寫一個函數Print()來打印n的每一位,如下表示:

Print(n)
如果n是1234,則表示為
Print(1234)//打印1234的每一位
其中1234中的4可以通過%10得到
那么Print(1234)可以分為兩步:
1.Print(1234/10)//相當于Print(123)打印123的每一位
2.printf(1234%10)//打印4
完成了上述兩個步驟就完成了1234的每一位打印
那么Print(123)又可以拆分為Print(123/10)+printf(123%10)

以此類推下去就有:

直到被打印的數字變成一位數的時候,就不再需要拆分,遞歸完成,有了上述的分析,代碼可以清晰的寫出,如下所示:

#include<stdio.h>
void Print(int n)
{if(n>9){Print(n / 10);printf("%d ", n % 10);}else{printf("%d ", n);}
}
int main()
{int n = 0;scanf_s("%d", &n);Print(n);
}

運行結果如下:

2.2.2圖示遞歸過程:

以上便是我為大家帶來的函數遞歸的第一部分內容,若有不足,望各位大佬在評論區指出,謝謝大家!可以留下你們點贊、收藏和關注,這是對我極大的鼓勵,我也會更加努力創作更優質的作品。再次感謝大家!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207696.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習---集成學習的初步理解

1. 集成學習 集成學習(ensemble learning)是現在非常火爆的機器學習方法。它本身不是一個單獨的機器學 習算法&#xff0c;而是通過構建并結合多個機器學習器來完成學習任務。也就是我們常說的“博采眾長”。集 成學習可以用于分類問題集成&#xff0c;回歸問題集成&#xff…

多線程并發Ping腳本

1. 前言 最近需要ping地址&#xff0c;還是挺多的&#xff0c;就使用python搞一個ping腳本&#xff0c;記錄一下&#xff0c;以免丟失了。 2. 腳本介紹 首先檢查是否存在True.txt或False.txt文件&#xff0c;并在用戶確認后進行刪除&#xff0c;然后從IP.txt的文件中讀取IP地…

CSS——sticky定位

1. 大白話解釋sticky定位 粘性定位通俗來說&#xff0c;它就是相對定位relative和固定定位fixed的結合體&#xff0c;它的觸發過程分為三個階段 在最近可滾動容器沒有觸發滑動之前&#xff0c;sticky盒子的表現為相對定位relative【第一階段】&#xff0c; 但當最近可滾動容…

【MATLAB】tvfEMD信號分解+FFT+HHT組合算法

有意向獲取代碼&#xff0c;請轉文末觀看代碼獲取方式~也可轉原文鏈接獲取~ 1 基本定義 TVFEMDFFTHHT組合算法是一種結合了總體變分模態分解&#xff08;TVFEMD&#xff09;、傅里葉變換&#xff08;FFT&#xff09;和希爾伯特-黃變換&#xff08;HHT&#xff09;的信號分解方…

vivado時序方法檢查8

TIMING-30 &#xff1a; 生成時鐘所選主源管腳欠佳 生成時鐘 <clock_name> 所選的主源管腳欠佳 &#xff0c; 時序可能處于消極狀態。 描述 雖然 create_generated_clock 命令允許您指定任意參考時鐘 &#xff0c; 但是生成時鐘應引用在其直接扇入中傳輸的時鐘。此…

電子學會C/C++編程等級考試2021年06月(五級)真題解析

C/C++等級考試(1~8級)全部真題?點這里 第1題:數字變換 給定一個包含5個數字(0-9)的字符串,例如 “02943”,請將“12345”變換到它。 你可以采取3種操作進行變換 1. 交換相鄰的兩個數字 2. 將一個數字加1。如果加1后大于9,則變為0 3. 將一個數字加倍。如果加倍后大于…

JS--異步的日常用法

目錄 JS 異步編程并發&#xff08;concurrency&#xff09;和并行&#xff08;parallelism&#xff09;區別回調函數&#xff08;Callback&#xff09;GeneratorPromiseasync 及 await常用定時器函數 JS 異步編程 并發&#xff08;concurrency&#xff09;和并行&#xff08;p…

Python中一些有趣的例題

下面會寫一些基礎的例題&#xff0c;有興趣的自己也可以練練手&#xff01; 1.假設手機短信收到的數字驗證碼為“278902”&#xff0c;編寫一個程序&#xff0c;讓用戶輸入數字驗證碼&#xff0c;如果數字驗證碼輸入正確&#xff0c;提示“支付成功”&#xff1b;否則提示“數…

Python configparser 模塊:優雅處理配置文件的得力工具

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 配置文件在軟件開發中扮演著重要的角色&#xff0c;而Python中的 configparser 模塊提供了一種優雅而靈活的方式來處理各種配置需求。本文將深入介紹 configparser 模塊的各個方面&#xff0c;通過豐富的示例代碼…

嵌入式雜記 - MDK的Code, RO-data , RW-data, ZI-data意思

嵌入式雜記 - Keil的Code, RO-data , RW-data, ZI-data意思 MDK中的數據分類MCU中的內部存儲分布MDK中數據類型存儲Code代碼段例子 RO-data 只讀數據段例子 RW-data 可讀寫數據段例子 ZI-data 清零數據段例子 在嵌入式開發中&#xff0c;我們經常都會使用一些IDE&#xff0c;例…

Hadoop學習筆記(HDP)-Part.17 安裝Spark2

目錄 Part.01 關于HDP Part.02 核心組件原理 Part.03 資源規劃 Part.04 基礎環境配置 Part.05 Yum源配置 Part.06 安裝OracleJDK Part.07 安裝MySQL Part.08 部署Ambari集群 Part.09 安裝OpenLDAP Part.10 創建集群 Part.11 安裝Kerberos Part.12 安裝HDFS Part.13 安裝Ranger …

Web前端 ---- 【Vue】Vuex的使用(輔助函數、模塊化開發)

目錄 前言 Vuex是什么 Vuex的配置 安裝vuex 配置vuex文件 Vuex核心對象 actions mutations getters state Vuex在vue中的使用 輔助函數 Vuex模塊化開發 前言 本文介紹一種新的用于組件傳值的插件 —— vuex Vuex是什么 Vuex 是一個專為 Vue.js 應用程序開發的狀態…

淺談前端代碼里的命名規范與注釋

淺談前端代碼里的命名規范與注釋 在前端代碼中&#xff0c;命名規范和注釋是非常重要的。它們不僅有助于提高代碼的可讀性和可維護性&#xff0c;還可以幫助開發者之間更好地協作和溝通。下面是一些關于命名規范和注釋的常見建議&#xff1a; 命名規范&#xff1a; 使用有意義…

【ArcGIS Pro微課1000例】0053:基于SQL Server創建與啟用地理數據庫

之前的文章有講述基于SQL Server創建企業級地理數據庫,本文講述在SQL Server中創建常規的關心數據庫,然后在ArcGIS Pro中將其啟用,轉換為企業級地理數據庫。 1. 在SQL Server中創建數據庫** 打開SQL Server 2019,連接到數據庫服務器。 展開數據庫連接,在數據庫上右鍵→新…

python中的lambda關鍵字

對于一切很模糊的知識&#xff0c;首要的是抓住概念的定義。 lambda&#xff1a;在 Python 中用于創建匿名函數的關鍵字。 也即&#xff0c;lambda是一種關鍵字&#xff0c;這種關鍵字的作用是創建匿名函數。 這一段很好懂&#xff0c;就是匿名函數有點懵。 什么是匿名函數&…

mybatis-plus構造器查詢

文章目錄 Hutool工具包Vo與entity轉換多表分頁查詢構造器&#xff1a;查詢構造器&#xff1a;拼接構造器&#xff1a;刪除操作構造器&#xff1a;修改操作查詢關鍵字 Hutool工具包Vo與entity轉換 BeanUtils&#xff1a;copyProperties(vo, entity)&#xff0c;vo轉實體類。 L…

在裝有 PostgreSQL 14 的 Red Hat8上安裝 `pg_cron`

要在裝有 PostgreSQL 14 的 Red Hat、CentOS、Fedora 或 Amazon Linux 上安裝 pg_cron&#xff0c;請遵循以下步驟。這些步驟假定您已經安裝了 PostgreSQL Global Development Group (PGDG) 的 PostgreSQL 版本。 安裝 pg_cron 擴展 使用 yum 安裝 pg_cron 擴展&#xff1a;s…

(四)Tiki-taka算法(TTA)求解無人機三維路徑規劃研究(MATLAB)

一、無人機模型簡介&#xff1a; 單個無人機三維路徑規劃問題及其建模_IT猿手的博客-CSDN博客 參考文獻&#xff1a; [1]胡觀凱,鐘建華,李永正,黎萬洪.基于IPSO-GA算法的無人機三維路徑規劃[J].現代電子技術,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

基于SSH的java記賬管理系統

基于SSH的java記賬管理系統 一、系統介紹二、功能展示四、其他系統實現五、獲取源碼 一、系統介紹 項目類型&#xff1a;Java EE項目 項目名稱&#xff1a;基于SSH的記賬管理系統 項目架構&#xff1a;B/S架構 開發語言&#xff1a;Java語言 前端技術&#xff1a;HTML、CS…

初識優先級隊列與堆

1.優先級隊列 由前文隊列queue可知&#xff0c;隊列是一種先進先出(FIFO)的數據結構&#xff0c;但有些情況下&#xff0c;操作的數據可能帶有優先級&#xff0c;一般出隊列時&#xff0c;可能需要優先級高的元素先出隊列&#xff0c;在此情況下&#xff0c;使用隊列queue顯然不…