Go語言比較遞歸和循環執行效率

一、概念

1.遞歸

遞歸是指一個函數在其定義中直接或間接調用自身的編程方法 。簡單來說,就是函數自己調用自己。遞歸主要用于將復雜的問題分解為較小的、相同類型的子問題,通過不斷縮小問題的規模,直到遇到一個最簡單、最基礎的情況(基本情況),從而停止遞歸。
遞歸算法有兩個過程,一是遞推過程,二是回歸的過程。

2.循環

循環是計算機科學運算領域的用語,也是一種常見的控制流程。循環是一段在程序中只出現一次,但可能會連續運行多次的代碼。循環中的代碼會運行特定的次數,或者是運行到特定條件成立時結束循環,或者是針對某一集合中的所有項目都運行一次。

二、執行過程

1.遞歸

在支持自調用的編程語言中,遞歸可以通過簡單的函數調用來完成,如計算階乘的程序在數學上可以定義為:
在這里插入圖片描述
遞歸程序執行過程可分解為下圖
在這里插入圖片描述

2.循環

循環開始前需要初始化變量,然后進入表達式做判斷,判斷為true,執行循環體,判斷為false則退出循環,輸出結果
循環程序執行過程可分解為下圖:
在這里插入圖片描述

三、代碼示例

1.go語言代碼示例

package mainimport ("fmt""time"
)// 直接遞歸調用,求n的階乘
// 參數:
//
//	n - 一個正整數,表示需要計算階乘的數字。
//
// 返回值:
//
// result - n 的階乘結果。
func recursion(n int) (result int) {if n >= 1 {// 直接遞歸調用函數result = n * recursion(n-1)return result}return 1
}// loop 計算給定數字的階乘。
// 參數:
//
//	n - 一個正整數,表示需要計算階乘的數字。
//
// 返回值:
//
//	result - n 的階乘結果。
func loop(n int) (result int) {// 當n < 0時,程序panic退出if n <= 0 {panic("Input must be a non-negative integer")}// 初始化 y 為 1,作為階乘計算的起始值。y := 1// 從 1 循環到 n,逐步計算階乘。for i := 1; i <= n; i++ {// 在每次循環中,將當前數字 i 與 y 相乘,累積階乘結果。y *= i}// 返回計算得到的階乘結果。return y
}func main() {// 初始化變量x為10,用于后續的遞歸和循環計算。x := 5// 開始遞歸計算,并記錄開始時間。startRecurison := time.Now()// 打印遞歸計算的開始時間、結果以及花費的時間。fmt.Printf("recurison start time:%v, result:%d\n", startRecurison, recursion(x))fmt.Println("elapse time:", time.Since(startRecurison))// 開始循環計算,并記錄開始時間。startLoop := time.Now()// 打印循環計算的開始時間、結果以及花費的時間。fmt.Printf("loop start time:%v, result:%d\n", startLoop, loop(x))fmt.Println("elapse time:", time.Since(startLoop))// 比較遞歸和循環的執行時間,判斷哪個更快。if time.Since(startRecurison) > time.Since(startLoop) {fmt.Println("loop algorithm is faster")} else {fmt.Println("recursion algorithm is faster")}
}

2.查看執行結果

最終比較結果:循環算法的執行效率更好,速度更快

PS D:\Project\GoWorkSpace\DataStructure\0408> go run .\Recursion.go
recurison start time:2025-04-09 10:49:17.117547 +0800 CST m=+0.005692801, result:120
elapse time: 2.9766ms
loop start time:2025-04-09 10:49:17.1205236 +0800 CST m=+0.008669401, result:120
elapse time: 533.2μs
loop algorithm is faster

四、總結

1.遞歸和循環的區別

1.1內存占用

遞歸:每次調用都會在調用棧中保存當前狀態,深度遞歸可能導致棧溢出(如 n=10000 時計算階乘)。
循環:通常只占用常量內存(如幾個變量)。

1.2效率

遞歸:函數調用需要額外開銷(保存上下文、參數傳遞等),但某些語言支持尾遞歸優化(如 Scheme),可減少開銷。
循環:通常更高效,無函數調用開銷。

1.3可讀性

遞歸:更符合分治、樹遍歷等問題的數學定義(如斐波那契數列、漢諾塔)。
循環:適合簡單重復任務(如遍歷數組)。

1.4典型場景

遞歸:分治算法(快速排序)、樹/圖遍歷(DFS)、動態規劃問題。
循環:線性操作(如求和、遍歷)、需要嚴格控制資源時。

1.5轉換與限制
  • 相互轉換
    任何遞歸問題都可以用循環(+棧結構)實現,反之亦然,但代碼復雜度可能變化。
  • 限制
    遞歸:受編程語言的調用棧深度限制。
    循環:需手動管理狀態,復雜邏輯可能使代碼臃腫。
1.6總結表格
遞歸循環
實現方式函數自我調用顯式迭代(for/while)
內存占用高(棧幀累積)低(常量空間)
性能可能因調用開銷較慢通常更高效
可讀性適合分治、樹結構問題簡單直觀
適用場景分治、回溯、數學遞歸問題線性操作、資源敏感任務

2.場景選擇

用遞歸:問題本身是遞歸結構、代碼簡潔性優先(如樹的遍歷)
用循環:追求性能、處理大數據量、避免棧溢出風險。

概念補充
遞歸展開:指通過逐步展示遞歸函數的調用過程,將遞歸的每一層執行細節明確呈現出來,以直觀理解遞歸如何分解問題、傳遞參數、返回結果。這一過程常用于分析遞歸邏輯、調試代碼或手動模擬遞歸行為。
如果出現遞歸算法棧溢出,用循環算法優化也是一種方法

如有疏漏,歡迎評論區留言

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

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

相關文章

keepalived高可用介紹

keepalived 是 Linux 一個輕量級的高可用解決方案&#xff0c;提供了心跳檢測和資源接管、檢測集群中的系統服務&#xff0c;在集群節點間轉移共享IP 地址的所有者等。 工作原理 keepalived 通過 VRRP&#xff08;virtual router redundancy protocol&#xff09;虛擬路由冗余…

數據分享:汽車測評數據

說明&#xff1a;如需數據可以直接到文章最后關注獲取。 1.數據背景 Car Evaluation汽車測評數據集是一個經典的機器學習數據集&#xff0c;最初由 Marko Bohanec 和 Blaz Zupan 創建&#xff0c;并在 1997 年發表于論文 "Classifier learning from examples: Common …

NLP簡介及其發展歷史

自然語言處理&#xff08;Natural Language Processing&#xff0c;簡稱NLP&#xff09;是人工智能和計算機科學領域中的一個重要分支&#xff0c;致力于實現人與計算機之間自然、高效的語言交流。本文將介紹NLP的基本概念以及其發展歷史。 一、什么是自然語言處理&#xff1f…

HOOPS Visualize:跨平臺、高性能的三維圖形渲染技術解析

在當今數字化時代&#xff0c;三維可視化技術已成為眾多行業的核心競爭力。HOOPS Visualize作為一款功能強大的三維圖形渲染引擎&#xff0c;憑借其卓越的渲染能力、跨平臺支持、豐富的交互功能、高度定制化以及快速部署等特性&#xff0c;為開發人員提供了構建高質量、高性能3…

藍橋杯速成刷題清單(上)

一、1.排序 - 藍橋云課 &#xff08;快速排序&#xff09;算法代碼&#xff1a; #include <bits/stdc.h> using namespace std; const int N 5e5 10; int a[N];int main() {int n;cin >> n;for (int i 0; i < n; i) {cin >> a[i];}sort(a, a n);for …

Java面試黃金寶典44

1. 查看進程的運行堆棧信息命令 gstack gstack 是 Linux 系統下用于查看指定進程運行時堆棧信息的工具。當程序出現崩潰、死鎖或者性能瓶頸等問題時,借助 gstack 可以查看進程中各個線程的調用棧,從而輔助開發人員定位問題。 定義 gstack 本質上是一個封裝了底層 ptrace 系統…

嵌入式硬件篇---TOF陀螺儀SPI液晶屏

文章目錄 前言1. TOF傳感器&#xff08;Time of Flight&#xff09;原理STM32使用方法硬件連接SDASCLVCC\GND 軟件配置初始化I2C外設庫函數驅動&#xff1a;讀取數據 2. 陀螺儀&#xff08;如MPU6050&#xff09;原理STM32使用方法硬件連接SDA/SCLINTVCC/GND 軟件配置初始化I2C…

【scikit-learn基礎】--『預處理』之 正則化

數據的預處理是數據分析&#xff0c;或者機器學習訓練前的重要步驟。 通過數據預處理&#xff0c;可以 提高數據質量&#xff0c;處理數據的缺失值、異常值和重復值等問題&#xff0c;增加數據的準確性和可靠性整合不同數據&#xff0c;數據的來源和結構可能多種多樣&#xff…

LeetCode Hot100 刷題筆記(2)—— 子串、普通數組、矩陣

目錄 前言 一、子串 1. 和為 K 的子數組 2. 滑動窗口最大值 3. 最小覆蓋子串 二、普通數組 4. 最大子數組和 5. 合并區間 6. 輪轉數組 7. 除自身以外數組的乘積 8. 缺失的第一個正數 三、矩陣 9. 矩陣置零 10. 螺旋矩陣 11. 旋轉圖像 12. 搜索二維矩陣 II 前言 一、子串&#…

【Git 常用操作指令指南】

一、初始化與配置 1. 設置全局賬戶信息 git config --global user.name "用戶名" # 設置全局用戶名 git config --global user.email "郵箱" # 設置全局郵箱 --global 表示全局生效&#xff0c;若需針對單個倉庫配置&#xff0c;可省略該參數 2.…

教培行業創建自己品牌的重要意義——教育培訓小程序

在競爭激烈的教培行業&#xff0c;創建自身品牌意義重大。 擁有獨特品牌能顯著提升機構競爭力與辨識度。如今教培市場同質化嚴重&#xff0c;一個亮眼的品牌小程序可使機構從眾多競爭者中脫穎而出&#xff0c;讓學員和家長快速識別并記住。 品牌小程序有助于增強信任度和口碑。…

Docker 介紹 · 安裝詳細教程

為什么選擇 Docker&#xff1f; ? 環境一致性 – 告別“在我機器上能跑”的問題&#xff0c;確保開發、測試、生產環境一致。 ? 高效輕量 – 秒級啟動&#xff0c;資源占用遠低于傳統虛擬機。 ? 跨平臺支持 – 可在任何支持 Docker 的環境中運行&#xff0c;包括云服務器、…

GitHub 上開源一個小項目的完整指南

GitHub 上開源一個小項目的完整指南 &#x1f680; 第一步&#xff1a;準備你的項目 在開源之前&#xff0c;確保項目是可用且有一定結構的&#xff1a; ? 最低要求 項目文件清晰、結構合理&#xff08;比如&#xff1a;src/、README.md、LICENSE&#xff09;項目能在本地正…

React 第三十節 使用 useState 和 useEffect Hook實現購物車

不使用 redux 實現 購物車案例 使用 React 自帶的 useState 和 useEffect Hook 即可實現購物車 export default function ShoppingCar() {// 要結算的商品 總數 以及總價const [totalNum, setTotalNum] useState(0)const [totalPerice, setTotalPerice] useState(0)// 商品…

藍橋杯第十一屆省賽C++B組真題解析

藍橋杯第十一屆省賽CB組真題解析 八、回文日期https://www.lanqiao.cn/problems/348/learning 方法一&#xff1a;暴力枚舉所有的日期&#xff0c;記錄有多少個回文日期。 #include <bits/stdc.h> using namespace std; int month[13]{0,31,28,31,30,31,30,31,31,30,31…

Python和MicroPython的解釋器區別

Python和MicroPython的解釋器不是同一個&#xff0c;它們在設計目標、實現方式和運行環境上都有顯著的區別。以下是它們的主要區別&#xff1a; 1. 底層實現 Python解釋器&#xff08;CPython&#xff09;&#xff1a; Python的標準解釋器是CPython&#xff08;C語言實現的Pyt…

Cython加密多層目錄中的Python腳本方案

近期有一個VueJavaDocker項目中需要加密Python腳本的需求&#xff0c;調研后決定采用Cython。 使用Cython編譯為二進制 步驟&#xff1a; 安裝Cython&#xff1a;pip install cython創建setup.py&#xff1a; from distutils.core import setup from Cython.Build import c…

力扣DAY40-45 | 熱100 | 二叉樹:直徑、層次遍歷、有序數組->二叉搜索樹、驗證二叉搜索樹、二叉搜索樹中第K小的元素、右視圖

前言 簡單、中等 √ 好久沒更了&#xff0c;感覺二叉樹來回就那些。有點變懶要警醒&#xff0c;不能止步于笨方法&#xff01;&#xff01; 二叉樹的直徑 我的題解 遍歷每個節點&#xff0c;左節點最大深度右節點最大深度當前節點當前節點為中心的直徑。如果左節點深度更大…

頭歌數據庫【數據庫概論】第10-11章 故障恢復與并發控制

第1關&#xff1a;數據庫恢復技術 1、事務的&#xff08; A&#xff09;特性要求事務必須被視為一個不可分割的最小工作單元 A、原子性 B、一致性 C、隔離性 D、持久性 2、事務的&#xff08;C &#xff09;特性要求一個事務在執行時&#xff0c;不會受到其他事務的影響。 A、原…

windows下,cursor連接MCP服務器

1.下載并安裝node 安裝后&#xff0c;在cmd命令框中&#xff0c;輸入命令node -v可以打印版本號&#xff0c;證明安裝完成 2.下載MCP服務器項目 在MCP服務器找到對應項目&#xff0c;這里以server-sequential-thinking為例子 在本地cmd命令窗口&#xff0c;使用下面命令下載…