【C語言】-遞歸

1、遞歸概念

遞歸(Recursion)是編程中一種重要的解決問題的方法,其核心思想是函數通過調用自身來解決規模更小的子問題,直到達到最小的、可以直接解決的基準情形(Base Case)。
在這里插入圖片描述

核心:自己調用自己
必要條件:

  • 基準情形(base case):函數不再遞歸調用的終止條件,避免無限循環;
  • 遞歸步驟(Recursive step):將原問題分解為規模更小的子問題,并通過遞歸調用解決。(每次遞歸調用后,越來越接近終止條件).

2、遞歸的應用場合

  • 數學問題:階乘計算、斐波那契數列、最大公約數
  • 數據結構遍歷:樹的遍歷、圖的深度優化搜索、鏈表操作(反轉、查找)
  • 分治算法:快速排序、歸并排序、漢諾塔問題
  • 其它:目錄結構遍歷、格式解析(JSON/XML)

3、遞歸的實現

/* 階乘函數 */
int factorial(int n) {// 基準情形if (n == 0) return 1;// 遞歸步驟return n * factorial(n - 1);
}/* 二叉樹遍歷,前序 */
struct TreeNode {int data;struct TreeNode* left;struct TreeNode* right;
};void preOrderTraversal(struct TreeNode* root) {if (root == NULL) return;  // 基準情形printf("%d ", root->data);  // 訪問根節點preOrderTraversal(root->left);  // 遞歸左子樹preOrderTraversal(root->right);  // 遞歸右子樹
}

尾遞歸(Tail Recursion)
尾遞歸是遞歸編程的一種特殊形式,其核心特點是:遞歸調用是函數的最后一個操作,且返回值不參與任何計算。這種結構允許編譯器將遞歸優化為迭代,避免棧溢出風險。
(1)普通遞歸 vs 尾遞歸

// 普通遞歸階乘(非尾遞歸):遞歸調用后還需進行額外計算(如乘法、加法)
int fact(int n) {if (n == 0) return 1;return n * fact(n-1);  // 遞歸調用后需進行乘法運算
}// 尾遞歸階乘:遞歸調用是最后一步,結果直接返回。
int fact_tail(int n, int acc) {if (n == 0) return acc;return fact_tail(n-1, n * acc);  // 遞歸調用是最后操作,無后續計算
}

(2)關鍵特征

  • 最后操作:遞歸調用必須是函數的最后一條語句。
  • 無后續計算:返回值直接來自遞歸調用,不參與額外運算。
  • 累加器參數:通常引入額外參數(如acc)保存中間結果

(3)尾遞歸的優缺點
優點

  • 避免棧溢出:優化后等效于迭代,棧空間復雜度為 O (1)。
  • 代碼簡潔:保持遞歸的邏輯清晰性,同時獲得迭代的性能。

缺點

  • 依賴編譯器優化:C 語言標準并未強制要求尾遞歸優化,部分編譯器(如 GCC)會自動優化,但并非所有平臺都支持。
  • 可讀性降低:引入累加器參數可能使代碼更難理解(如斐波那契的尾遞歸版本)。

4、遞歸的優缺點

優點

  • 代碼簡潔:直接表達問題的數學定義,減少代碼量。
  • 易于理解:對于遞歸定義的問題(如樹結構),邏輯更清晰。
  • 解決復雜問題:適合分治策略,如排序和搜索算法。
    缺點
  • 性能開銷:遞歸調用會消耗棧空間,可能導致棧溢出(Stack Overflow)。
  • 效率問題:某些遞歸(如斐波那契數列)存在大量重復計算,可用 記憶化(Memoization) 優化。
  • 調試困難:多層遞歸調用的執行流程復雜,調試時堆棧跟蹤較深。

5、常見相關問題

(1)必須確保基準情形存在,否則會導致無限遞歸,最終引發棧溢出。
(2)注意遞歸深度,過深建議調整為循環或迭代。
(3)使用打印語句跟蹤遞歸過程,或結合調試器查看調用棧。

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

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

相關文章

12.5Swing控件3Jpanel JOptionPane

JPanel JPanel是一個輕量級容器組件,用于組織和管理其他 GUI 組件。它繼承自JComponent類,屬于javax.swing包,可以容納按鈕、文本框、標簽等控件 JPanel 默認使用的布局管理器是 FlowLayout,也可以嵌套其他面板,以便…

MIPI信號為什么不能進行長距離傳輸

1.關于MIPI信號傳輸 MIPI信號是不適合長距離傳輸的。 2.MIPI的信號擺幅小,抗干擾能力比較弱 MIPI信號的差分擺幅比較小,通常只有100mV~200mV,遠遠低于LVDS的350mV的擺幅 小擺幅信號在長線纜上傳輸的時候更容易被噪聲淹沒,信噪比下降&#xf…

Qt的學習(二)

1. 創建Hello Word 兩種方式,實現helloworld: 1.通過圖形化的方式,在界面上創建出一個控件,顯示helloworld 2.通過純代碼的方式,通過編寫代碼,在界面上創建控件, 顯示hello world; …

Windows11+VS2019配置Libigl-2.4.1

Windows11VS2019配置Libigl-2.4.1 由于課題需要,所以出一篇配置Libigl的博客,制作不易,請多多點贊 一、官網下載 官網:https://libigl.github.io/ GitHub下載地址:https://github.com/libigl/libigl 這里我們選擇…

地球科學方向(Geoscience and Remote Sensing),1天見刊,當月可檢索!

CSP科學出版社,旨在通過為研究人員提供最佳環境來發表、參考、閱讀和引用他們的作品,從而為科學界服務。現已與科檢易學術達成出版戰略合作,現在聯合共同出版高質量學術水平的期刊,為方便廣大科研學者投稿方便,現已經建…

基于 Three.js 的 3D 模型快照生成方案

基于 Three.js 的 3D 模型快照生成方案 此方案通過 Three.js 渲染場景并異步生成圖像數據,同時支持分辨率縮放和 Blob 格式輸出,為模型預覽、截圖保存等需求提供完整解決方案。 問題分析: 使用html2canvas 生成的快照畫布顯示為空&#xff…

「Java基本語法」變量的使用

變量定義 變量是程序中存儲數據的容器,用于保存可變的數據值。在Java中,變量必須先聲明后使用,聲明時需指定變量的數據類型和變量名。 語法 數據類型 變量名 [ 初始值]; 示例:聲明與初始化 public class VariableDemo {publi…

SpringCloud學習筆記-2

說明:來源于網絡,如有侵權請聯系我刪除 1.提問:如果注冊中心宕機,遠程調用還能成功嗎 答:當微服務發起請求時,會向注冊中心請求所有的微服務地址,然后在向指定的微服務地址發起請求。在設計實…

Hac - NBh標準JSON協議使用說明文檔

Hac - NBh 標準 JSON 協議使用說明文檔 一、協議概述 Hac - NBh 標準 JSON 協議是專為物聯網設備與服務器數據交互設計的通信協議。以 JSON 格式為基礎,采用鍵值對(KV 值)組織數據,支持靈活選取數據項,通過 CBOR 格式實現高效傳輸,并利用 AES 128 加密保障數據安全。 …

k8s從入門到放棄之Service負載均衡

k8s從入門到放棄之Service負載均衡 在 Kubernetes (K8s) 中,Service 是一種抽象,它定義了一組邏輯上的 Pod 和訪問它們的策略。Service 的主要目的是提供一種可靠的方式來訪問一組具有相同標簽(Label)的 Pod,即使這些…

【題解-洛谷】P10480 可達性統計

題目:P10480 可達性統計 題目描述 給定一張 N N N 個點 M M M 條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。 輸入格式 第一行兩個整數 N , M N,M N,M,接下來 M M M 行每行兩個整數 x , y x,y x,y,表示從 …

SpringCloud2025+SpringBoot3.5.0+gateway+webflux子服務路由報503

文章目錄 前言一、問題二、原因1.分析2.配置靜態路由再試3.定位 總結 前言 本來昨天就應該也記錄下,免得忘記的,但是有點晚了,酒沒寫,真的是被坑慘了。 當然這也是追求最新的代價,也是對新技術、老知識點的重溫…

破解路內監管盲區:免布線低位視頻樁重塑停車管理新標準

城市路內停車管理常因行道樹遮擋、高位設備盲區等問題,導致車牌識別率低、逃費率高,傳統模式在復雜路段束手無策。免布線低位視頻樁憑借超低視角部署與智能算法,正成為破局關鍵。該設備安裝于車位側方0.5-0.7米高度,直接規避樹枝遮…

RAG 文檔解析難點1:多欄布局的 PDF 如何解析

寫在前面 在構建檢索增強生成 (Retrieval-Augmented Generation, RAG) 應用時,高質量的數據源是成功的基石。PDF 作為一種廣泛使用的文檔格式,承載著海量的知識。然而,許多 PDF 文檔,特別是學術論文、期刊、雜志和一些報告,都采用了多欄布局 (multi-column layout)。 直…

全面掌握Pandas時間序列處理:從基礎到實戰

時間序列數據在金融分析、物聯網、商業智能等領域無處不在。作為Python數據分析的核心庫,Pandas提供了強大而全面的時間序列處理功能。本文將系統介紹Pandas時間序列處理的各個方面,從基礎概念到高級應用,幫助您在實際工作中高效處理時間序列…

vscode 離線安裝第三方庫跳轉庫

我安裝的是C/C的函數跳轉 下載的離線庫: 項目首頁 - vscode代碼自動補全跳轉插件離線安裝包:cpptools-win32.vsix是一款專為VSCode設計的離線安裝插件,特別適合無法連接網絡的電腦環境。通過安裝此插件,您的VSCode將獲得強大的代碼自動跳轉…

GitHub 趨勢日報 (2025年06月05日)

📊 由 TrendForge 系統生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日報中的項目描述已自動翻譯為中文 📈 今日獲星趨勢圖 今日獲星趨勢圖 1472 onlook 991 HowToCook 752 ChinaTextbook 649 quarkdown 451 scrapy 324 age…

關于如何使用VScode編譯下載keil工程的步驟演示

1、vscode的插件市場下載keil Assistant 2 、點設置 3、復制keil的地址 4、粘貼到第…

OD 算法題 B卷【最大島嶼體積】

文章目錄 最大島嶼體積 最大島嶼體積 大于0的數表示陸地,0表示水,請計算由陸地、水組成的網格中最大島嶼的體積;陸地的數字之和表示所在島嶼的體積,島嶼總是被水包圍,并且每座島嶼只能由水平或者垂直方向上相鄰的陸地…

一文讀懂 Docker Compose(白話版)

一、Docker Compose 是個啥? 想象你開餐廳: 單容器 一個廚師 👨🍳Docker Compose 整個后廚團隊 👨🍳👩🍳🧑🍳 菜單 工作流程 用個菜單文件(…