【追求卓越06】算法--遞歸

引導

????????遞歸算法算是我們比較常用的一種算法。但是想用好并不簡單。本章我不再介紹簡單的概念,主要講解遞歸算法的優缺點和如何用遞歸寫代碼。

個人愛好

其實相對于使用while循環,我更喜歡使用遞歸算法。為什么呢?

  • 使用遞歸算法代碼往往會變得更加簡潔,特別當其他人使用whilefor等幾十行代碼實現功能,而你僅僅需要幾行代碼。就特別有一種自豪感。
  • 遞歸算法,我覺得對思維的邏輯性要求更高,遞歸算法常常會把人帶入思維誤區,腦袋一場混雜
    以上是我個人喜歡使用遞歸的主要原因。

但是遞歸算法也存在很多的弊端:

  1. 棧溢出。我們知道函數參數和局部變量都是保存在棧中的,并且每個線程的棧空間默認大小為8M。
  2. 空間復雜度高。和棧溢出的道理一樣
  3. 重復計算。這個要視具體的問題了,可能會出現重復計算的現象
  4. 過多的函數調用會耗時較多。我們知道函數調用的過程會有額外的時間消耗在上下文保存中。當遞歸層次很深的時候,就會是一個很客觀的時間消耗。

如何解決這些弊端?

其中1,3,4我們可以通過控制的遞歸層次來進行控制,如:

int deep = 0
f(n)
{
??? deep++;
??? /
*規定最多遞歸100層*
/
??? if(deep > 100)
??? {
??????? return;
??? }
??? f(n-1);
}

????????關于重復計算,我們可以通過使用hash表來進行處理。將f(m)的結果進行hash保存,在處理f(n)時,現在hash表中查看是否存在該value。

如何使用遞歸?

????????遞歸說簡單也簡單,說難也很難。簡單就是將問題能夠分為子問題和找到終止條件即可。困難在于如何從一個具體的問題中,分析出這兩個條件

????????比如教科書上利用遞歸計算階乘值,這些很簡單。因為你能夠很容易分析出問題分為子問題和終止條件。

????????但是如果你要使用遞歸處理下面的問題,你可以很快的給出結果嗎?合并兩條有序鏈表。可以在鏈表練習題中找點思路。【追求卓越03】數據結構--鏈表練習題-CSDN博客

????????其實,我覺得想要熟練掌握好遞歸,你要多練,多做題,多思考。這樣你才能對一個具體的問題,分析出遞歸公式以及終止條件。

????????僅僅通過他人三言兩語給你分析,你是很難得到進步。別人能夠很快的分析出來,那是人家經過了大量的練習。這點要注意哦!!!

總結

????????本節,我們主要介紹了大家熟知的遞歸算法以及它存在的一些問題:棧溢出,空間復雜度高,函數調用耗時多,以及對應的解決方式。

????????寫遞歸的方式:找到遞歸公式終止條件。再轉化為代碼。并且只有大量練習,才能熟練掌握遞歸算法。

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

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

相關文章

Java語言中的控制流程

控制流程是編程中的重要概念之一,它允許程序根據條件執行不同的代碼塊或重復執行特定的代碼塊。在Java中,控制流程由條件語句和循環語句組成。本文將詳細介紹Java中的條件語句(if語句和switch語句)和循環語句(for循環、…

MySQL用戶與權限管理

快捷查看指令 ctrlf 進行搜索會直接定位到需要的知識點和命令講解(如有不正確的地方歡迎各位小伙伴在評論區提意見,博主會及時修改) MySQL用戶與權限管理 登錄 #本地登錄 mysql -uroot -p123456#遠程登錄 #客戶端語法:mysql -…

聚觀早報 |快手Q3營收;拼多多殺入大模型;Redmi K70E開啟預約

【聚觀365】11月23日消息 快手Q3營收 拼多多殺入大模型 Redmi K70E開啟預約 華為nova 12系列或下周發布 亞馬遜啟動“AI就緒”新計劃 快手Q3營收 財報顯示,快手第三季度營收279億元,同比增長20.8%;期內盈利21.8億元,去年同期…

貓罐頭多久喂一次?好用的貓罐頭牌子推薦

貓愛吃貓罐頭,包含各種美味,提供營養和口感。但喂貓吃罐頭需技巧和耐心,以確保貓健康快樂成長。 作為一個從業寵物營養師7年的人,可以說對于貓咪的食物很有研究和貓罐頭品牌選購上,我有自己的見解。 一、貓罐頭多久喂…

shell之wc命令

shell之wc命令 Linux中的wc命令是一個用于統計給定文件中的字節數、字數和行數的工具。它也可以從標準輸入讀取數據并統計。 wc命令的語法為: wc [選項] 文件... 如果沒有給出文件名,則從標準輸入讀取。wc同時也給出所有指定文件的總統計數。wc命令的選…

40、Flink 的Apache Kafka connector(kafka source 和sink 說明及使用示例) 完整版

Flink 系列文章 1、Flink 部署、概念介紹、source、transformation、sink使用示例、四大基石介紹和示例等系列綜合文章鏈接 13、Flink 的table api與sql的基本概念、通用api介紹及入門示例 14、Flink 的table api與sql之數據類型: 內置數據類型以及它們的屬性 15、Flink 的ta…

循環神經網絡(RNN)實現股票預測

文章目錄 一、前言二、前期工作1. 設置GPU(如果使用的是CPU可以忽略這步)2. 導入數據 四、數據預處理1.歸一化2.設置測試集訓練集 五、構建模型六、激活模型七、訓練模型八、結果可視化1.繪制loss圖2.預測3.評估 一、前言 我的環境: 語言環…

【Rust】快速教程——一直在單行顯示打印、輸入、文件讀寫

前言 恨不過是七情六欲的一種,再強大的恨也沒法獨占整顆心,總有其它情感隱藏在心底深處,說不定在什么時候就會掀起滔天巨浪。——《死人經》 圖中是Starship扔掉下面的燃料罐,再扔掉頭頂的翅膀后,再翻轉過來著陸火星的…

Andorid : Toast(彈出框)- 簡單應用

Toast Android官方在Android API 30版本(或更高版本)之后即對該方法不生效。 只要SDK版本低于30,Toast.setGravity()方法即可生效 MainActivity.java package com.example.mytoast;import androidx.appcompat.app.AppCompatActivity;import android.content.Cont…

[C++ 從入門到精通] 13.派生類、調用順序、繼承方式、函數遮蔽

📢博客主頁:https://loewen.blog.csdn.net📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!📢本文由 丶布布原創,首發于 CSDN,轉載注明出處🙉📢現…

SOEM主站開發篇(2):添加SOEM主站APP程序

0 工具準備 1.SOEM-1.4.0源碼(官網:http://openethercatsociety.github.io/) 2.Linux開發板(本文為正點原子I.MX6U ALPHA開發板) 3.交叉編譯工具(arm-linux-gnueabihf-gcc) 4.cmake(版本不得低于3.9,本文為3.9.2) 5.Ubuntu 16.04(用于編譯生成Linux開發板的可執行文…

【Unity細節】Default clip could not be found in attached animations list.(動畫機報錯)

👨?💻個人主頁:元宇宙-秩沅 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?! 本文由 秩沅 原創 😶?🌫?收錄于專欄:unity細節和bug 😶?🌫?優質專欄 ?【…

生產制造業如何謀求數字化轉型?需要哪些信息化系統做支撐?

生產制造業的數字化轉型是將數字系統和各種技術整合到傳統制造流程中的過程,這將導致行業格局的重大變革。工業4.0的到來為制造業開創了一個新時代,制造商可以簡化生產線,提高整體效率。同時,這一技術革命使他們能夠收集到大量的數…

計算機網絡實用工具之tcpdump

簡介 tcpdump是一個運行在命令行下的數據包分析器。能夠獲取到該計算機發送或接收的TCP/IP和其他數據包。 tcpdump 適用于大多數的類Unix操作系統,包括Linux、Solaris、BSD、Mac OS X、HP-UX和AIX 等等。在這些系統中,tcpdump 需要使用libpcap這個捕捉…

Altium Designer學習筆記9

忽視了一個最大的問題,就是元器件的封裝,不應該是根據AD系統的封裝走,而應該是根據立創商城上的規格書,確認每個封裝的大小,畫出封裝圖,然后才是布局和走線。 1、確認電容的封裝采用0805,貼片電…

【css】Google第三方登錄按鈕樣式修改

文章目錄 場景前置準備修改樣式官方屬性修改樣式CSS修改樣式按鈕的高度height和border-radiusLogo和文字布局 場景 需要用到谷歌的第三方登錄,登錄按鈕有自己的樣式。根據官方文檔:概覽 | Authentication | Google for Developers,提供兩種第…

局域網協議:地址解析協議(ARP,Address Resolution Protocol)

地址解析協議(ARP,Address Resolution Protocol)是一種用于在IP網絡中將IP地址映射到物理MAC地址的協議。在IP網絡中,IP是用于尋址,真正將數據包從一個設備發送到另外一個設備,用于通信的是物理MAC地址。 …

40、Flink 的Apache Kafka connector(kafka sink的介紹及使用示例)-2

Flink 系列文章 1、Flink 部署、概念介紹、source、transformation、sink使用示例、四大基石介紹和示例等系列綜合文章鏈接 13、Flink 的table api與sql的基本概念、通用api介紹及入門示例 14、Flink 的table api與sql之數據類型: 內置數據類型以及它們的屬性 15、Flink 的ta…

geemap學習筆記012:如何搜索Earth Engine Python腳本

前言 本節主要是介紹如何查詢Earth Engine中已經集成好的Python腳本案例。 1 導入庫 !pip install geemap #安裝geemap庫 import ee import geemap2 搜索Earth Engine Python腳本 很簡單,只需要一行代碼。 geemap.ee_search()使用方法 后記 大家如果有問題需…

vue截取URL中的參數

url: http://localhost:81/login?redirect%2Findex&access_tokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvdUV4dGVybmFsSWQiOiI0OTI2MjYzMTIxMDU1NDAxMTM4IiwiYXVkIjpbImVudGVycHJpc2VfbW9iaWxlX3Jlc291cmNlIiwiYmZmX2FwaV9yZXN 截取參數: let…