C語言 --- 函數遞歸

函數遞歸

  • 一、什么是函數遞歸
  • 二、函數遞歸的要點
  • 三、示例
    • 1.計算n的階乘
    • 2.提取一個任意正整數的所有位數,按順序排列
    • 3.獲取第n個斐波那契數,最開始的兩個數是1,1
  • 四、總結

一、什么是函數遞歸

函數遞歸是一種解決問題的思想,是將一個大的問題化為一個一個小的問題(類似于剝洋蔥),是在一個函數體內部自己調用自己的方法。遞歸就是遞推加回歸,是基于函數實現的。
例如:

// 第一個最簡單的函數遞歸程序:int main()
{printf("hahaha\n");main();       // 在main函數體內再次調用自己,這就是遞歸return 0;
}

運行結果:

在這里插入圖片描述

但是這是一個問題程序,因為沒有臨界條件,所以會死遞歸下去,最終導致出現上圖中棧溢出(Stack overflow)。
因為每一次函數遞歸都會創建函數棧幀,此棧幀創建在內存的棧區,最終死遞歸,棧區空間消耗完畢,出現棧溢出的問題。

二、函數遞歸的要點

基于點一,函數遞歸有以下兩個要點:

1. 函數遞歸要有臨界條件,每次遞歸后都要逼近此條件,否則會出現死遞歸的情況,到達臨界條件,將不再函數調用
2. 并不是所有的程序都能寫成函數遞歸形式,并且就算是能寫成函數遞歸的形式,在函數遞歸調用過程中會創建函數棧幀,產生運行時的開銷(空間,時間),空間可能出現棧溢出的問題,時間影響運行效率,所以在某些程序中迭代(循環)和遞歸形式都能實現,并且遞歸實現代碼比迭代實現更加復雜,那么還是使用迭代實現。

三、示例

1.計算n的階乘

實現思路:
在這里插入圖片描述

// 示例1:設計一個程序,計算n的階乘
int func(int n)
{if (n == 0)return 1;elsereturn func(n - 1) * n;
}int main()
{// 計算n的階乘int n = 0;scanf("%d", &n);int ret = func(n);printf("%d\n", ret);return 0;
}

遞歸過程:
在這里插入圖片描述

2.提取一個任意正整數的所有位數,按順序排列

實現思路:
在這里插入圖片描述

// 示例2:設計一個程序,提取一個任意正整數的所有位數,按順序排列
void func(int m)
{// 當m為一位數時,直接提取自身if (m >= 0 && m <= 9)printf("%d ", m % 10);else{func(m / 10);printf("%d ", m % 10);}
}int main()
{int m = 0;scanf("%d", &m);func(m);return 0;
}

遞歸過程:
在這里插入圖片描述

3.獲取第n個斐波那契數,最開始的兩個數是1,1

實現思路:
在這里插入圖片描述

// 示例3:設計一個程序,獲取第n個斐波那契數,最開始的兩個數是1,1
int fib(int n)
{if (n == 1 || n == 2){return 1;}else{return fib(n - 1) + fib(n - 2);}
}int main()
{int n = 0;scanf("%d", &n);int ret = fib(n);printf("%d\n", ret);return 0;
}

這里直接說出結果,這是一個有問題的遞歸程序,當n很大很大的時候,上述代碼執行效率非常低下,因為:
在這里插入圖片描述
所以這就是一個邏輯思維上運用遞歸的思想,但是遞歸實現出來有些許問題,正確的思路:
定文三個變量,a,b,c,讓a等于0位置上的數據,b等于1位置上的數據,c等中于a加上b的數據,c就是我們所求的第n個斐波那契數。之后再先讓b的值賦值給給a,c的值賦值給給b,循環下去,直到n>2才結束。最后返回c。

int fib(int n) {// 定義三個變量,a,b,c// a是第一個數字1,b是第二個數字1// c是我們所需要的第n個斐波那契數int a=1, b=1,c;// 當所求斐波那契數是前兩個的時候,直接給定值即可if(n == 1 && n == 2)c=a;      // 此時斐波那契數就是1// 當所求斐波那契數是從第三個開始時while(n > 2){c = a + b;// 更新數據,注意別出現數據覆蓋的情況a = b;b = c;n--; }// 返回斐波那契數return c;}

四、總結

上述的遞歸演示,第一個main函數內部再次調用自己導致出現棧溢出的錯誤是因為沒有設定臨界條件;前兩個示例演示了如何分析一個程序如何變成遞歸思想,并且理清它的遞歸調用關系;最后一個示例就演示了在某寫可以寫成遞歸的程序,但是遞歸的實現有問題的這種程序,建議是使用迭代的思想去實現。

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

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

相關文章

GitHub 趨勢日報 (2025年07月14日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖1916claude-code795the-book-of-secret-knowledge728free-for-dev547markitdown367…

PyTorch中張量(TensorFlow)操作方法和屬性匯總詳解和代碼示例

1、張量的操作匯總 下面是 PyTorch 中常見的 張量操作方法匯總&#xff0c;包括 創建、索引、變換、數學運算、廣播機制、維度操作 等內容&#xff0c;并附上詳解和代碼示例&#xff0c;便于系統學習與實戰參考。一、張量創建&#xff08;torch.tensor 等&#xff09; import t…

統一日志格式規范與 Filebeat+Logstash 實踐落地

背景 在多部門、多技術棧并存的企業環境中&#xff0c;日志收集與分析是保障系統穩定運行的核心能力之一。然而&#xff0c;不同開發團隊采用各異的日志打印方式&#xff0c;導致日志數據結構混亂&#xff0c;嚴重影響后續的收集、存儲、檢索與告警效率。 比如我們大部門就有多…

【鴻蒙HarmonyOS】鴻蒙app開發入門到實戰教程(三):實現一個音樂列表的頁面

鴻蒙里面&#xff0c;實現一個音樂播放的列表,模擬數組的數據展示 實現效果代碼實現 準備數據 songs:SongItemTypes[] [{img:https://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.jpg,name:直到世界的盡頭,author:WANDS},{img:https://yjy-teach-oss.oss-cn…

2025年滲透測試面試題總結-2025年HW(護網面試) 47(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2025年HW(護網面試) 47 1. UDF提權 2. 命令執行與代碼執行的區別 3. 文件包含利用姿勢 4. 漏洞復現流程 …

iPhone 數據擦除軟件評測(最新且全面)

當您準備出售、捐贈或回收 iPhone 時&#xff0c;僅僅恢復出廠設置并不足以保證您的個人數據徹底消失。專業的 iPhone 數據擦除軟件采用先進的技術&#xff0c;確保您的敏感信息永久無法恢復。本文回顧了十種流行的 iPhone 數據擦除工具&#xff0c;詳細介紹了它們的功能、優點…

Qt 將觸摸事件轉換為鼠標事件(Qt4和Qt5及以上版本)

在Qt中&#xff0c;觸摸事件&#xff08;QTouchEvent&#xff09;和鼠標事件&#xff08;QMouseEvent&#xff09;是兩種不同的輸入事件類型。通常情況下&#xff0c;觸摸事件不會自動轉換為鼠標事件&#xff0c;因為它們代表的是不同的輸入設備&#xff08;觸摸屏 vs 鼠標&…

Blender 云渲染高效流程:渲染 101 集群加速實戰?

一、核心優勢&#xff1a;適配 Blender 全場景需求? ? 全渲染器深度兼容? Cycles&#xff08;CPU/GPU 模式&#xff09;&#xff1a;云端 4090 顯卡渲染速度比本地快 12 倍&#xff0c;支持 8K 分辨率 16K 紋理無壓力? Eevee 實時渲染&#xff1a;集群同步輸出預覽動畫&am…

SQL學習記錄01

什么是SQL&#xff1f; Structured Query Language &#xff08;結構化查詢語言&#xff09;&#xff0c;與關系型數據庫進行通信的標準語言。什么是數據庫&#xff1f;“按照數據結構來組織、存儲、和管理數據的倉庫。”一個長期存儲在計算機內的、有組織的、可共享的、統一管…

醫療項目如何應對法規變更?

醫療項目應對法規變更的關鍵策略包括建立法規監測體系、及時內部培訓和溝通、調整業務流程和合規標準、技術系統快速迭代升級。 其中&#xff0c;建立有效的法規監測體系尤其重要。這意味著企業需要實時關注監管機構發布的政策更新和公告&#xff0c;迅速理解法規變化內容及對自…

AI Top10

AI 前十排名排名團隊/機構名稱國家核心優勢領域1DeepMind英國強化學習、Alpha系列模型2OpenAI美國GPT系列、多模態大模型3DeepSeek中國高效NLP模型、開源生態建設4Google Brain美國Transformer架構、TensorFlow框架5Meta AI (FAIR)美國計算機視覺、Llama系列模型6NVIDIA Resear…

LabVIEW通知器函數應用

介紹LabVIEW通知器&#xff08;Notifier&#xff09;函數&#xff0c;演示兩類并行循環通信場景&#xff1a;單對循環數據交互、多循環通知聚合&#xff0c;含程序框圖&#xff08;數據發送 / 接收、多循環通知&#xff09;與前面板&#xff08;數據顯示&#xff09;。功能說明…

推薦《Python 編程:從入門到實踐》之Python編程的基礎知識

在 Python 學習資源琳瑯滿目的當下&#xff0c;《Python 編程&#xff1a;從入門到實踐》脫穎而出&#xff0c;堪稱 Python 入門的不二之選。本書由經驗豐富的教育工作者撰寫&#xff0c;以清晰易懂的語言和循序漸進的方式&#xff0c;引領讀者從 Python 的基礎語法逐步邁向實際…

Kafka入門和基礎配置

目錄Kafka入門消息引擎系統ABC快速搞定Kafka術語kafka三層消息架構名詞術語Kafka基礎Kafka部署參考重要配置參數Broker端參數Topic級別參數JVM參數Kafka是消息引擎系統&#xff0c;也是分布式流處理平臺Kafka入門 消息引擎系統ABC 民間版&#xff1a;系統 A 發送消息給消息引…

OPENPPP2 VEthernet 網絡協議堆棧(CTCP)VNetStack 深度技術解析

&#x1f310; OPENPPP2 VEthernet 網絡協議堆棧&#xff08;CTCP&#xff09;VNetStack 深度技術解析&#x1f3d7;? 一、系統架構全景圖 #mermaid-svg-FdlbKZCGQDDbvOL6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermai…

Gartner發布2025年中國網絡安全成熟度曲線:網絡安全的重點正轉向保護AI、推動業務轉型和增強組織韌性

網絡安全的重點正轉向保護人工智能、推動業務轉型和增強組織韌性。首席信息官及其安全和風險管理主管可以利用這份技術成熟度曲線來識別實用且高價值的技術和實踐&#xff0c;從而保持安全和敏捷。 戰略規劃假設 到2027年&#xff0c;60%的中國大型組織將在安全運營中心&#x…

網絡準入控制系統的作用解析,2025年保障企業入網安全第一道防線

在當今數字化時代&#xff0c;網絡已成為企業運營的基礎&#xff0c;隨著網絡的廣泛應用&#xff0c;網絡準入控制系統作為保障網絡安全的重要手段&#xff0c;正發揮著至關重要的作用。保障網絡安全網絡準入控制系統如同網絡的忠誠衛士&#xff0c;它為網絡大門安裝了智能鎖&a…

java基礎(day09)

目錄 1.繼承的作用 2.繼承樹 3.protected和super protected super 注&#xff1a;super/this()--構造方法&#xff0c;第一行&#xff0c;一般不同時出現 4.向上向下轉型 向上轉型 向下轉型 final 小結 1.繼承的作用 理解&#xff1a;首先就是可以實現代碼復用&#x…

如何進行選擇。

初始理解問題 首先&#xff0c;我們需要明確題目在問什么。題目“House Robber”描述的是一個強盜在一排房屋前&#xff0c;每個房屋都有一定數量的錢。強盜不能連續搶劫兩個相鄰的房屋&#xff0c;否則會觸發警報。目標是搶劫到最多的錢。 動態規劃的思路 這個問題可以使用動態…

PHP語法高級篇(三):Cookie與會話

Cookie與會話在 Web 編程中十分實用&#xff1a;Cookie 能實現一周免登錄&#xff0c;還能記住用戶的主題偏好&#xff1b;會話可保存當前用戶信息&#xff0c;也能臨時存儲購物車數據。本篇文章將記錄Cookie與會話的學習過程。 一、Cookie cookie 常用于識別用戶。cookie 是服…