H遞歸函數.go

前言:遞歸函數是一種強大而又充滿魅力的編程技巧。它就像是一面神奇的鏡子,函數在其中能夠調用自身的倒影,從而以一種簡潔而優雅的方式解決許多復雜的問題。?

目錄

一、遞歸函數是啥玩意兒

二、遞歸函數的優缺點

優點

缺點

三、遞歸函數能干啥

四、遞歸函數咋優化

五、遞歸函數經典案例 - 漢諾塔問題

總結


一、遞歸函數是啥玩意兒

遞歸函數說白了,就是函數自己調用自己。不過,咱可不能讓函數這么一直調用下去沒完沒了,不然程序就 “跑偏” 了。所以得給它設個 “停止信號”,也就是終止條件。一到這個條件,函數就老實停下來,不再調自己啦,然后把之前算出來的結果一層一層地返回去。

舉個超簡單的例子,算階乘就特別適合用遞歸函數。階乘就是把一個正整數 n 和所有比它小的正整數都乘起來,像 5! = 5 × 4 × 3 × 2 × 1。咱用遞歸的思路想,其實就是 n! = n × (n - 1)! ,那咱就讓函數自己調自己,把問題越變越小,直到變成 1! = 1,這時候就讓函數停住返結果。

package mainimport "fmt"func factorial(n int) int {if n == 1 { // 咱的終止條件就這兒,要是 n 是 1,就返 1return 1}return n * factorial(n-1) // 這里函數就開始調自己啦,看不看懂?
}func main() {fmt.Println(factorial(5)) // 試一試,看看會不會返 120 呢
}

看看,這代碼是不是超簡潔?就像把問題一層層剝開,找到最里面的核心,然后再一層層包回去,把結果算出來。

二、遞歸函數的優缺點

優點

  • 代碼簡潔 :遞歸函數能把復雜問題拆成小問題,代碼看著就清爽多了。比如算斐波那契數列(斐波那契數列就是從 0 和 1 開始,后面的數都是前兩個數的和),遞歸寫法就很簡單:

package mainimport "fmt"func fibonacci(n int) int {if n <= 1 {return n}return fibonacci(n-1) + fibonacci(n-2) // 自己調自己,把問題拆小
}func main() {fmt.Println(fibonacci(10)) // 算一算第 10 個斐波那契數
}

缺點

  • 性能問題 :遞歸調用自己會搞出好多新的棧幀(棧幀就是函數調用時在內存里占的小窩),要是調用太多次,就會把棧給搞溢出,程序就直接 “撲街” 了。而且像斐波那契數列的簡單遞歸寫法,會算好多重復的東西,效率很低。

  • 調試困難 :遞歸函數調來調去,調試的時候得跟著好多層函數調用,搞起來有點麻煩。

三、遞歸函數能干啥

  • 樹或圖的遍歷 :比如遍歷文件系統里的目錄,遞歸地把每個文件夾和文件都瞅一遍:

package mainimport ("fmt""path/filepath"
)func traverseDir(path string) {entries, err := filepath.Glob(filepath.Join(path, "*"))if err != nil {fmt.Println("哎呀,出錯了:", err)return}for _, entry := range entries {if info, err := filepath.Stat(entry); err == nil && info.IsDir() {fmt.Println("哇,這是個文件夾:", entry)traverseDir(entry) // 遞歸遍歷子文件夾} else {fmt.Println("嘿,這是個文件:", entry)}}
}func main() {traverseDir("./testdir") // 假設當前目錄下有個叫 testdir 的文件夾
}
  • 深度優先搜索(DFS) :在迷宮求解、八皇后這種問題里都能用上,像是在迷宮里一直往深處走,走不通了再回來換條路。

四、遞歸函數咋優化

  • 記憶化 :對于斐波那契數列,可以用記憶化避免重復算,搞個 “小本本” 把算過的結果記下來:

package mainimport "fmt"func fibonacci(n int, memo map[int]int) int {if val, exists := memo[n]; exists { // 先瞅瞅算過沒return val}if n <= 1 {memo[n] = n} else {memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)}return memo[n]
}func main() {memo := make(map[int]int)fmt.Println(fibonacci(10, memo)) // 算一算第 10 個斐波那契數
}
  • 尾遞歸優化 :把遞歸調用放在函數的最后一步,有些編譯器會把它優化成循環,避免把棧搞崩。比如算階乘的尾遞歸寫法:

package mainimport "fmt"func factorial(n int, acc int) int {if n == 0 {return acc}return factorial(n-1, n*acc) // 尾遞歸調用
}func main() {fmt.Println(factorial(5, 1)) // 算一算 5 的階乘
}

五、遞歸函數經典案例 - 漢諾塔問題

漢諾塔是個超經典的遞歸問題。有三根柱子 A、B、C,A 上面有 n 個盤子,按從大到小疊著。要求把所有盤子都移到 C 上,每次只能移一個,還不能把大的盤子放在小的上面。

package mainimport "fmt"func hanoi(n int, from, aux, to string) {if n == 1 {fmt.Printf("把盤子 1 從 %s 移到 %s\n", from, to)return}hanoi(n-1, from, to, aux)      // 把 n-1 個盤子從 from 移到 auxfmt.Printf("把盤子 %d 從 %s 移到 %s\n", n, from, to) // 移最后一個盤子hanoi(n-1, aux, from, to)      // 把 n-1 個盤子從 aux 移到 to
}func main() {hanoi(3, "A", "B", "C") // 算一算 3 個盤子咋移
}

這段代碼把問題拆成把 n-1 個盤子移來移去的子問題,最后就解決了整個漢諾塔問題。

總結

遞歸函數就是這么個既厲害又有點小脾氣的工具。寶子們要是剛入門別怕,多寫寫多練練,理解了它的終止條件和調用過程,就能輕松用它搞定好多復雜問題。不過寫的時候得注意性能問題,要是函數調用太多,棧就不夠用了,必要時就用優化技巧。相信寶子們只要肯花時間,很快就能掌握遞歸函數的精髓,讓它變成自己編程路上的好幫手。

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

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

相關文章

軟件功能測試的測試標準

一、軟件功能測試行業標準概述 軟件功能測試行業標準是規范軟件測試流程、方法、工具及人員資質的準則&#xff0c;是確保軟件產品的功能性、可靠性、易用性等質量特性符合用戶需求。這些標準不僅為測試人員提供了明確的指導&#xff0c;也為軟件產品的質量控制提供了有力保障。…

EchoEar(喵伴):樂鑫發布與火山引擎扣子聯名 AI 智能體開發板

隨著生成式人工智能技術的快速發展&#xff0c;大語言模型 (LLM) 正逐步成為推動智能設備升級的核心力量。樂鑫科技攜手火山引擎扣子大模型團隊&#xff0c;共同推出智能 AI 開發套件 —— EchoEar&#xff08;喵伴&#xff09;。該套件以端到端開發為核心理念&#xff0c;構建…

圖像特征檢測算法SIFT

SIFT&#xff08;Scale - Invariant Feature Transform&#xff0c;尺度不變特征變換&#xff09;是一種計算機視覺領域的特征提取算法&#xff0c;具有重要的地位和廣泛的應用。 算法原理 構建高斯金字塔 &#xff1a; 為了實現多尺度檢測&#xff0c;SIFT 算法會構建高斯金…

光纖通道收發器:市場洞察、技術演進與未來機遇

一、引言 在數字化浪潮席卷全球的當下&#xff0c;數據存儲與傳輸的需求呈爆發式增長。光纖通道收發器作為高速、可靠數據存儲網絡&#xff08;如存儲區域網絡 SAN&#xff09;中的關鍵組件&#xff0c;發揮著至關重要的作用。它通過光纖實現服務器、存儲設備和交換機之間的數…

candence17.4如何設置兩個焊盤之間在TOP與BOTTOM可以存在兩根線

為什么要走兩根線&#xff1f; 為了過大電流&#xff0c;有時候就需要我們在TOP、BOTTOM兩個面走線&#xff0c;同時開窗&#xff0c;然后通過加錫的方式增加過流能力&#xff1b; 當然由于兩面都有導線&#xff0c;必然會存在過孔&#xff0c;而過孔的過流能力不僅與過孔孔徑…

Dify:參數調節,讓LLM從能用到好用的機制

前言 隨著大語言模型(LLM)在文本生成、智能對話、技術問答等前沿領域的深度滲透&#xff0c;參數精細化調節已成為開發者駕馭 AI 能力的核心必修課。 本文將系統的解釋溫度(Temperature)、核采樣(Top - P)、截斷采樣(Top - K)等關鍵參數的底層作用機制&#xff0c;結合多種場景…

防抖不同的實現

防抖&#xff08;Debounce&#xff09;&#xff1a;在事件被觸發后&#xff0c;延遲一段時間再執行函數。如果在延遲期間事件再次被觸發&#xff0c;則重新計時。常用于搜索框輸入、窗口大小調整等場景。 1.不安裝任何依賴和庫&#xff0c;編寫一個防抖的函數 在utils里面增加…

MySQL 數據庫索引詳解

一、索引是什么&#xff1f;能干嘛&#xff1f; 類比理解&#xff1a;索引就像書的目錄。比如你想查《哈利波特》中 “伏地魔” 出現的頁數&#xff0c;不用逐頁翻書&#xff0c;直接看目錄找關鍵詞就行。數據庫里的索引就是幫你快速找到數據的 “目錄”。 核心作用&#xff…

【620公司工作記錄】

已有數據匯總 好的,完全同意。在編寫新代碼之前,清晰地盤點我們手中已有的“彈藥”是至關重要的一步。 根據您提供的 test/20250610_88_100mm_frame_000.csv 文件頭,我來為您完整地解析一下我們當前擁有的全部數據字段。我們的數據是以“行”為單位組織的,每一行都代表一…

SpringBoot 集成Caffeine實現一級緩存

SpeingBoot 集成Caffeine實現一級緩存使我們經常遇到的場景。今天我們具體分享一下&#xff1a; 首先 Caffeine 作為一級緩存&#xff0c;它是 Spring 5.x 默認的本地緩存實現&#xff0c;性能優于 Guava Cache&#xff0c;且支持過期時間設置。緩存執行的流程圖如下&#xff…

中科米堆3D自動掃描檢測系統三維數字化智能解決方案

3D自動掃描檢測系統基于先進的光學、激光或結構光等測量技術&#xff0c;能夠快速、準確地獲取工件的三維幾何數據。在檢測過程中&#xff0c;系統通過向被測工件投射特定的光模式&#xff0c;利用高分辨率相機捕捉工件表面的反射光信息&#xff0c;再經過復雜的算法處理&#…

Unity3d中使用Mirror進行自定義消息通信

一、服務端&#xff1a; 1.創建服務端腳本MyServer.cs 繼承自NetworkManager類 using Mirror; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class MyServer : NetworkManager {[Header(&quo…

Odoo 18 固定資產管理自動化指南

如何在Odoo 18中實現資產管理自動化 1. 創建資產模型實現資產管理自動化 使用 Odoo 18 的會計模塊&#xff0c;資產的創建和確認可輕松實現自動化。這將使資產管理變得更加簡單高效。使用資產自動化功能&#xff0c;一旦驗證相關產品的供應商賬單&#xff0c;Odoo將自動生成并…

如何輕松地將音樂從 iPhone 傳輸到 Mac?

想把音樂從 iPhone 傳輸到 Mac 嗎&#xff1f;這很常見&#xff0c;無論你是想更換設備、備份收藏&#xff0c;還是只想在更大的屏幕上欣賞喜愛的歌曲。幸運的是&#xff0c;有 6 種有效的方法可以完成這項工作&#xff0c;具體取決于你喜歡使用的工具。讓我們開始吧。 第 1 部…

人工智能——解讀AI智慧課堂系統解決方案【附全文閱讀】

該文檔是 AI 智慧課堂系統解決方案,聚焦教育信息化需求,通過 AI 技術與教學深度融合,解決傳統課堂考勤效率低、資源管理難、分析不精準等問題。 方案以課堂為核心,構建 “背景分析 - 方案設計 - 優勢價值” 框架,技術架構涵蓋教師攝像機、學生抓拍機、智能錄播主機等設備,…

使用Nginx的RTMP模塊進行直播流轉HLS時,處理和預防`.ts`文件過多

當使用Nginx的RTMP模塊進行直播流轉HLS時,如果長時間運行或處理大量流媒體內容,可能會遇到.ts文件累積過多的問題。這不僅會占用大量的磁盤空間,還可能影響系統性能。以下是一些處理和預防.ts文件過多的方法: 1. 配置HLS清理 Nginx RTMP模塊允許配置HLS片段的過期時間,這…

結構體解決冒泡排序

設計英雄的結構體 //1、設計結構體 struct Hero {string name;//姓名int age;//年齡string sex;//性別 };創建英雄的數組 //2、創建數組存放英雄 struct Hero Array[5] {{"劉備", 34 ,"男"},{"關羽", 45 ,"男"},{"張飛",…

spring-webmvc @RequestParam 典型用法

典型用法 基本使用 HTTP請求參數綁定到方法參數 GetMapping("/users") public String getUsers(RequestParam String name) {return "Hello, " name; }請求&#xff1a;/users?nameJohn 輸出&#xff1a;Hello, John-----GetMapping("/filter&qu…

AntDesignPro前后端權限按鈕系統實現

目錄 Ant Design Pro 后端接口權限按鈕系統 系統架構圖 前端實現 權限按鈕組件 (AuthButton.tsx) 權限鉤子 (useAccess.ts) 權限服務 (permission.ts) 產品列表頁面 (ProductList.tsx) 后端接口設計 (Node.js Express 示例) 權限接口控制器 (permissionController.js…

RAG工程落地:處理文檔中表格數據

在 RAG&#xff08;Retrieval-Augmented Generation&#xff09;工程落地過程中&#xff0c;處理文檔中的表格數據 是一個非常重要但復雜的問題&#xff0c;特別是針對技術文檔、報告、論文等結構化強的資料。比如PDF文檔里的表格數據&#xff0c;如下&#xff1a; RAG處理表格…