C語言————函數遞歸(通俗易懂)

????????我們在學習些新的函數時,首先我們得理解它是什么?是怎么定義的?然后去了解他的用途,最后我們自己要會用,知道用在什么地方什么時候用用的時候要注意些什么

有一個條理清晰的學習邏輯,會讓我們學習起來事半功倍。

小博在這里帶大家從入門到應用,用通俗易懂的文字講清楚函數遞歸

一、遞歸是什么

遞歸:簡單點說就是函數自己調用自己。可以理解為俄羅斯套娃,將一個大型的復雜的問題層層轉化為和原問題相似的規模較小的子問題來求解,直到不能夠再拆分為止。

凡事物極必反,遞歸也一樣。遞歸必須是有條件的,不能夠無限遞歸下去

:遞推;:回歸。你品,你細品。 🤨🤨

二、遞歸舉例

come on !! 直接上例題:

求n!

1、用數學公式求n!

當我沒有學過遞歸時,我腦子里根本想不到用其他的方法,只能根據數學公式,去解決這個問題。

即n!=n*(n-1)*(n-2)*......*2*1。

//用數學公式求n!
#include <stdio.h>
int main()
{int n = 0;int ret = 1;scanf("%d", &n);for (int i = 1; i <= n; i++){ret *= i;}printf("%d", ret);return 0;
}

2、用遞歸的方法求n!

當我學了遞歸之后,看到這個數學問題是有規律的,即:

//用遞歸方法求n!
#include <stdio.h>
int Fact(int n)
{if (n == 0)return 1;elsereturn n * Fact(n - 1);  //繼續調用Fact(),直到n=1為止
}int main()
{int n = 0;scanf("%d", &n);int ret=Fact(n);    //調用函數Fact()printf("%d", ret);return 0;
}

3、分析遞歸過程

三、遞歸練習

根據上面的講解,想必大家對遞歸也有了初步的了解,下面我來寫一道例題,大家可以自行練習一下。

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

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

1、小博分析

我們先進行分析,可以用筆寫出分析過程,找出規律,往遞歸上靠。

小博分析:

小博剛開始分析時,發現了該過程的規律,但當小博嘗試寫代碼去解決的時候,卻寫不出對應的代碼,完了卡住了 😥😥,你們是不是也經常這樣!!

事后,小博對自己的行為進行了反思,發現:首先我并沒有捋清楚自己的思路,抱著試一試、感覺會了的態度去寫,結果問題沒有解決,反而還花費了大量的時間,同時心靈還受到極大的挫敗感。所以,我們在寫代碼時,要先有清晰明了的思路之后再去寫。俗話說,磨刀不誤砍柴功呢!

回歸正題:

按照上面小博的分析,發現是倒著打印出來該數字的,如果想正著打印的話,還需再分析

我們發現一個數的最低位是最容易得到的,要想辦法把該數拆開,直到拆成一位就不用再拆了。

2、代碼實現

#include <stdio.h>
void print(int m)
{if (m > 9){print(m / 10);}printf("%d ", m % 10);	
}int main()
{int m = 0;scanf("%d", &m);print(m);  //用來打印m的每一位return 0;
}

代碼的流程

注意:每次調用print()函數時,就會進入該函數,再進入該函數......每一級的print() 都是來自上一步的,然而每次執行完該函數時,都會留下一個printf("%d",m);未被執行,因此執行結束后,還會一步一步返回回歸到上層去執行該語句。

????????此外,使用遞歸的時候要注意,每次遞歸函數的調用都會開辟屬于自己的棧幀空間,稱為運行時堆棧,直到函數遞歸不再繼續,還是回歸才逐釋放棧幀空間。所以遞歸太深,就會浪費太多的棧幀空間,也可能會造成棧溢出。

????????看完上述內容,是否對遞歸有了更深的理解呢!!然而我們要知道,遞歸很難想到,也不一定是最優解,但是有的地方會簡化代碼,讓問題簡單化。

學習數據結構時,會常用到遞歸。

好了小博今天就將到這里,歡迎大家留言評論!!

這里小博再送給大家我喜歡的一句話:“與鳳凰同飛,必是俊鳥;與虎狼同行,必是猛獸。

加油!!

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

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

相關文章

路由基礎(三):靜態路由、動態路由、默認路由

靜態路由 靜態路由&#xff1a;管理員使用手工方式為路由器添加路由 三種添加靜態路由的方式&#xff1a; 配置下一跳配置出接口出接口和下一跳都配置 備注&#xff1a;不配置出接口時&#xff0c;路由器會進行路由遞歸查詢 #添加去往10.1.1.0網段的靜態路由&#xff0c;下一跳…

大模型開發之:LangChain4j【附資料】

什么是 LangChain4j&#xff1f; LangChain4j 是一個專為 Java 生態系統設計的開源&#xff08;Apache 2.0 許可&#xff09;框架&#xff0c;用于簡化基于大語言模型&#xff08;LLM&#xff09;的應用程序開發。它的名字和靈感來源于其"前輩"——為 Python 設計的 …

SyntaxError: Failed to execute ‘open‘ on ‘XMLHttpRequest‘: Invalid URL

這就是在ajax請求的時候URL不正確&#xff0c; 例如&#xff1a; http://192.168.124.168:8082api/v1/task/get 正確的是這樣的&#xff1a; http://192.168.124.168:8082/api/v1/task/get 這個錯誤的來源是 baseUrl apiUrl 導致的&#xff0c; 比如baseUrl http://19…

程序代碼篇---類

為什么有類&#xff1a;要理解編程語言中為什么會有 “類”&#xff0c;我們可以從日常生活的例子入手。想象你要描述 “汽車” 這個事物&#xff1a;它有屬性&#xff08;顏色、品牌、排量&#xff09;它有行為&#xff08;行駛、剎車、鳴笛&#xff09;如果沒有類&#xff0c…

jenkins備份遷移

1、確認Jenkins版本 在web界面操作步驟&#xff1a;登錄Jenkins管理控制臺點擊左上角"Jenkins"圖標選擇"Manage Jenkins" > "About Jenkins"在頁面中查看"Version"字段顯示的具體版本號&#xff08;如2.479.2&#xff09; 建議截圖…

Video Ocean 接入 GPT-5

Video Ocean&#xff1a;全球首個接入 GPT-5 的視頻智能體引領 AI 視頻創作革命 一、技術全景&#xff1a;Video Ocean 的架構與創新 1.1 全球首個 GPT-5 視頻智能體的技術突破 Video Ocean 作為全球首個接入 GPT-5 的視頻智能體&#xff0c;代表了 AI 視頻生成領域的重大突…

如何在API高并發中玩轉資源隔離與限流策略?

url: /posts/4ad4ec1dbd80bcf5670fb397ca7cc68c/ title: 如何在API高并發中玩轉資源隔離與限流策略? date: 2025-08-27T23:26:45+08:00 lastmod: 2025-08-27T23:26:45+08:00 author: cmdragon summary: 資源隔離是保障API穩定性的核心,通過路由隔離和依賴隔離實現關鍵業務與…

Swift 解法詳解 LeetCode 365:水壺問題

文章目錄摘要描述題解答案題解代碼分析代碼拆解示例測試及結果時間復雜度空間復雜度總結摘要 這道題其實就是經典的 “兩個水壺問題”&#xff0c;你可能在電影《虎膽龍威3》里見過&#xff0c;布魯斯威利斯用兩個水壺精確量出 4 升水來解除炸彈。這題就是把那個場景搬到了編程…

Redis集群介紹——主從、哨兵、集群

Redis集群介紹 集群里有三大模式&#xff1a; Redis主從模式&#xff1a;一主一從或一主多從&#xff0c;自帶讀寫分離&#xff0c;負載均衡&#xff1b; Redis哨兵模式&#xff1a;高可用&#xff0c;主服務器宕機&#xff0c;從服務器變為主服務器&#xff1b; Redis集群…

【大前端】封裝一個React Native與Android/IOS 端通用的埋點接口

RN 層只暴露一個統一的埋點方法&#xff0c;例如 trackEvent(eventName, params)&#xff0c;內部通過 NativeModule 調用 Android/iOS 的原生埋點 SDK。這樣 RN 層不用關心具體實現。寫一個通用的示例&#xff1a;1. RN 層封裝統一接口&#xff08;JS 代碼&#xff09;// anal…

詳解 外部負載均衡器 → Ingress Controller Pod 這個過程

在常見的生產架構中&#xff1a; 外部負載均衡器&#xff08;Ng/ELB/ALB/NLB等&#xff09;終止來自客戶端的 HTTPS 連接。 它將解密后的明文 HTTP 請求轉發給后端的 Kubernetes Ingress Controller Pods。 Ingress Controller 處理 HTTP 請求&#xff0c;并將 HTTP 響應返回給…

Markdown 編輯器 語法

這里寫自定義目錄標題歡迎使用Markdown編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右SmartyPants創建一個自定義列表如何創建一個注…

【PyTorch項目實戰】SAM(Segment Anything Model) —— 致力于建立第一個圖像分割基礎模型

文章目錄一、SAM&#xff08;Segment Anything Model&#xff09; —— 致力于建立第一個圖像分割基礎模型&#xff08;Foundation Model&#xff09;1、項目背景2、核心任務設計3、模型架構&#xff1a;圖像編碼器 提示編碼器 掩碼解碼器4、核心創新&#xff1a;可提示分割任…

第一次實習總結

開發模式的轉變現在雖然不怎么使用很傳統的軟件開發模型了&#xff0c;但是好歹也要敏捷開發吧。事實上&#xff0c;我這個小廠甚至做的更絕。全程無UML。。。需要一天&#xff1a;1.項目組長與客戶進行需求對接。2.項目組長然后就找我來講述需求&#xff0c;我就直接制作出原型…

創建uniApp小程序項目vue3+ts+uniapp

vscode創建pnpm i -D types/wechat-miniprogram uni-helper/uni-app-types{"compilerOptions": {"types": ["dcloudio/types","types/wechat-miniprogram","uni-helper/uni-app-types"] },"vueCompilerOptions": …

GitHub 熱榜項目 - 日榜(2025-08-28)

GitHub 熱榜項目 - 日榜(2025-08-28) 生成于&#xff1a;2025-08-28 統計摘要 共發現熱門項目&#xff1a;13 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱門項目凸顯三大技術趨勢&#xff1a;1) AI領域持續爆發&#xff0c;涵蓋大模型系統提示研究(asgeirt…

IPV6

本節課要掌握的知識點&#xff08;學習目標&#xff09; 概括IPv6相較于IPv4的優勢 (Why IPv6?) 描述IPv6的基本概念 描述IPv6報文頭部的格式和原理 描述IPv6地址格式和地址類型 描述IPv6地址配置的方法和基本過程 執行IPv6地址以及IPv6靜態路由的簡單配置 一、IPV6 基礎…

零基礎開發應用:cpolar+Appsmith平民化方案

文章目錄前言1.什么是Appsmith2.Docker部署3.Appsmith簡單使用4.安裝cpolar內網穿透5. 配置公網地址6. 配置固定公網地址總結前言 你是否也曾想搭建一個屬于自己的應用&#xff0c;卻被復雜的編程知識嚇退&#xff1f;或者&#xff0c;想快速開發一個小工具解決工作難題&#…

【Ruoyi 解密 - 08. 前端探秘1】------ 從“交互原理”到“開發邏輯”,后端也能看懂的前端實戰指南

Ruoyi-Vue3 核心知識點串講&#xff1a;從“交互原理”到“開發邏輯”&#xff0c;后端也能看懂的前端實戰指南 對于非前端工程師而言&#xff0c;學習 Ruoyi-Vue3 并非要成為專業前端開發者&#xff0c;而是要掌握“前后端交互邏輯”——搞懂數據如何從后端接口流轉到前端頁面…

Java SpringBoot+Mybatis-Flex+Logback實現打印日志

先看效果2025-08-26 09:52:19.834 [http-nio-10003-exec-10] INFO c.x.c.logging.RequestLoggingFilter - HTTP請求: {headers{content-length213, host192.168.31.149:10003, content-typeapplication/json, connectionkeep-alive, accept-encodinggzip, deflate, br, user-a…