遞歸及其使用

遞歸及其使用

  • 1. 什么是遞歸?
  • 2. 遞歸解決什么問題?
  • 3. 遞歸的步驟
  • 4. 使用遞歸的注意事項
  • 5. 示例

1. 什么是遞歸?

遞歸是指在函數的定義中使用函數自身的過程。簡單來說,遞歸是通過將大問題分解為更小的子問題來解決問題的一種方法。遞歸函數在執行時會反復調用自身,直到達到某個終止條件。

2. 遞歸解決什么問題?

遞歸的使用可以簡化問題的解決過程,特別適用于那些具有遞歸結構或可分解為子問題的復雜問題。遞歸的主要優勢在于它提供了一種自然而簡潔的方式來解決這些問題。

3. 遞歸的步驟

  1. 定義遞歸函數的基本情況(終止條件):遞歸函數需要定義一個或多個基本情況,即當滿足某個條件時,遞歸停止并返回結果。這是確保遞歸函數不會無限循環的關鍵。
  2. 將大問題分解為子問題:遞歸函數應該通過將大問題分解為一個或多個更小的子問題來解決。每個子問題都是原始問題的規模更小的版本。
  3. 在遞歸函數中調用自身:在解決子問題時,遞歸函數會調用自身來處理子問題。遞歸函數的調用應該是在滿足遞歸終止條件之前的步驟。
  4. 組合子問題的結果:遞歸函數在處理完子問題后,需要將子問題的結果組合起來得到原始問題的解。

4. 使用遞歸的注意事項

  1. 確保遞歸終止條件的正確性:遞歸函數必須定義一個或多個終止條件,以避免無限遞歸。如果終止條件不正確或者缺失,遞歸函數可能會導致無限循環,最終耗盡計算資源。
  2. 確保每次遞歸調用都能向終止條件靠近:遞歸調用的參數或輸入應該是可以縮小問題規模的,這樣每次遞歸調用都能使問題向終止條件靠近。否則,遞歸函數可能會陷入無盡的遞歸循環。
  3. 注意遞歸的性能問題:遞歸函數可能會生成大量的函數調用和堆棧幀,消耗較多的內存和計算資源。在某些情況下,使用迭代等其他方法可能更高效。

5. 示例

  1. 合并兩個有序鏈表

    public class MergeSortedLists {public ListNode mergeLists(ListNode l1, ListNode l2) {// 處理遞歸終止條件if (l1 == null) {return l2;}if (l2 == null) {return l1;}// 比較兩個鏈表頭節點的值,并選擇較小的節點作為合并后鏈表的頭節點if (l1.val < l2.val) {l1.next = mergeLists(l1.next, l2); // 遞歸調用mergeLists函數return l1;} else {l2.next = mergeLists(l1, l2.next); // 遞歸調用mergeLists函數return l2;}}
    }
    

    定義一個遞歸函數mergeLists,該函數接受兩個有序鏈表的頭節點作為參數,并返回合并后的鏈表的頭節點。

    在函數內部,首先處理遞歸終止條件。如果其中一個鏈表為空,直接返回另一個鏈表的頭節點。

    比較兩個鏈表的頭節點的值,將較小值的節點作為合并后鏈表的頭節點,并將其next指針指向遞歸調用mergeLists函數的結果。

    遞歸調用mergeLists函數,傳入較小節點的next指針和另一個鏈表的頭節點作為參數。

    返回合并后的鏈表的頭節點。

  2. 判斷鏈表是否有環

    public class Solution {public boolean hasCycle(ListNode head) {// 判斷鏈表是否為空或只有一個節點,不構成環if (head == null || head.next == null) {return false;}ListNode slow = head;  // 慢指針ListNode fast = head.next;  // 快指針return hasCycleRecursive(slow, fast);}private boolean hasCycleRecursive(ListNode slow, ListNode fast) {// 如果快指針到達鏈表末尾,說明沒有環if (fast == null || fast.next == null) {return false;}// 如果快指針追上慢指針,說明存在環if (fast == slow || fast.next == slow) {return true;}// 繼續移動指針return hasCycleRecursive(slow.next, fast.next.next);}
    }
    

    首先,在 hasCycle() 方法中檢查鏈表是否為空或只有一個節點,這種情況下不會形成環,直接返回 false。

    然后,將慢指針 slow 初始化為鏈表頭,快指針 fast 初始化為 slow 的下一個節點。

    接下來,調用 hasCycleRecursive() 方法進行遞歸判斷。在遞歸方法中,首先判斷快指針是否到達鏈表末尾,如果是,則鏈表不包含環,返回 false。然后,判斷快指針是否追上慢指針或者快指針的下一個節點是否追上慢指針,如果是,則鏈表包含環,返回 true。最后,繼續遞歸調用 hasCycleRecursive() 方法,將慢指針指向下一個節點,快指針指向下下個節點,繼續進行判斷。

    注意,這里使用了兩個條件進行判斷,即快指針是否追上慢指針,或者快指針的下一個節點是否追上慢指針。這是因為快指針每次移動兩步,而慢指針每次移動一步,所以在形成環的情況下,兩個指針可能會有一個節點的差距。

    最后,在主函數中調用 hasCycle() 方法,傳入鏈表的頭節點,即可判斷鏈表是否存在環。

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

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

相關文章

[職場] 關于薪酬需要知道的兩個知識點 #知識分享#知識分享

關于薪酬需要知道的兩個知識點 薪酬問題是面試過程中比較核心的問題&#xff0c;也是每次面試必問的。如果你進入到面試的后一階段&#xff0c;這類問題可以讓面試官或企業判斷求職者的要求是否符合企業的薪酬標準&#xff0c;并進一步判斷求職者對自身價值的認可程度。關于薪…

數據結構之快速排序算法(快排)【圖文詳解】

P. S.&#xff1a;以下代碼均在VS2019環境下測試&#xff0c;不代表所有編譯器均可通過。 P. S.&#xff1a;測試代碼均未展示頭文件stdio.h的聲明&#xff0c;使用時請自行添加。 博主主頁&#xff1a;LiUEEEEE ??????????????????? ?? …

【Java數據結構】詳解Stack與Queue(三)

&#x1f512;文章目錄&#xff1a; 1.????前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2. 隊列&#xff08;Queue&#xff09; 2.1隊列的概念 2.2隊列的方法 2.3隊列的使用 2.4循環隊列 循環隊列的介紹 循環隊列圖 如何區分循環隊列是滿還是空…

外掛知識庫的基本知識與內容

外掛知識庫 1.什么是rag&#xff1f; RAG,即LLM在回答問題或生成文本時&#xff0c;會先從大量文檔中檢索出相關的信息&#xff0c;然后基于這些信息生成回答或文本&#xff0c;從而提高預測質量。 2.外掛知識庫的實現思路 只用幾十萬量級的數據對大模型進行微調并不能很好…

第五十六周:文獻閱讀

目錄 摘要 Abstract 文獻閱讀&#xff1a;應用于地表水總磷濃度預測的可解釋CEEMDAN-FE-LSTM-Transformer混合模型 一、現有問題 二、提出方法 三、方法論 1、CEEMDAN&#xff08;帶自適應噪聲的完全包絡經驗模式分解&#xff09; 2、FE&#xff08;模糊熵 &#xff09…

Vue3【十】07使用ref創建基本類型的響應式數據以及ref和reactive區別

Vue3【十】07使用ref創建基本類型的響應式數據以及ref和reactive區別 ref 也可以創建對象類型的響應式數據&#xff0c;不過要使用.value ref 處理對象數據的時候&#xff0c;底層數據還是reactive格式的 reactive 重新分配一個新對象&#xff0c;會失去響應式可以使用Object.a…

自注意力機學習

自注意力機制的核心概念 1. Query, Key 和 Value Query&#xff08;查詢向量&#xff09;&#xff1a;可以看作是你當前在關注的輸入項。假設你正在閱讀一段文字&#xff0c;這就像你當前在讀的句子。 Key&#xff08;鍵向量&#xff09;&#xff1a;表示其他所有輸入項的標識…

保姆級 | MySQL的安裝配置教程(非常詳細)

一、下載Mysql 官網步驟 MySQLhttps://www.mysql.com/進入官網首頁 點擊DOWNLOADS 點擊MySQL Community (GPL) Downloads 點擊 小頁面直接進入 MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/點擊“Download”下載最新版本&#xff0c;其他…

【吊打面試官系列】MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?

大家好&#xff0c;我是鋒哥。今天分享關于 【MySQL 中 InnoDB 支持的四種事務隔離級別名稱&#xff0c;以及逐級之間的區別&#xff1f;】面試題&#xff0c;希望對大家有幫助&#xff1b; MySQL 中 InnoDB 支持的四種事務隔離級別名稱&#xff0c;以及逐級之間的區別&#xf…

碳素鋼化學成分分析 螺紋鋼材質鑒定 鋼材維氏硬度檢測

碳素鋼的品種主要有圓鋼、扁鋼、方鋼等。經冷、熱加工后鋼材的表面不得有裂縫、結疤、夾雜、折疊和發紋等缺陷。尺寸和允許公差必須符合相應品種國家標準的要求。 具體分類、按化學成分分類 &#xff1a; 碳素鋼按化學成分&#xff08;即以含碳量&#xff09;可分為低碳鋼、中…

機器學習筆記 - stable diffusion web-ui安裝教程

一、Stable Diffusion WEB UI 屌絲勁發作了,所以本地調試了Stable Diffusion之后,就去看了一下Stable Diffusion WEB UI,網絡上各種打包套件什么的好像很火。國內的也就這個層次了,老外搞創新,國內跟著屁股后面搞搞應用層,就叫大神了。 不扯閑篇了,我們這里從git源碼直接…

問題:11單位內部人員對行政機關作出的行政處分不服,可申請行政復議. #其他#微信

問題&#xff1a;11單位內部人員對行政機關作出的行政處分不服,可申請行政復議. 參考答案如圖所示

問題:脾梗塞時,下列情況最符合的是 #職場發展#知識分享#媒體

問題&#xff1a;脾梗塞時,下列情況最符合的是 A、脾腫大 B、脾區摩擦感 C、兩者均有 D、兩者均無 參考答案如圖所示

uniapp視頻組件層級太高,解決方法使用subNvue原生子體窗口

目錄 前言 先看一下uniapp官網的原話&#xff1a; subNvue的一些參數介紹 subNvues使用方法&#xff1a; 綁定id 顯示 subNvue 彈出層 subNvue.show() 參數信息 subNvue.hide() 參數信息 在使用subNvue 原生子體窗口 遇到的一些問題 前言 nvue 兼容性 以及使用方式 控…

基于 中間件 的 數據交換平臺 的實現

一、介紹 A. 背景和目的 隨著云計算、大數據和物聯網等技術的快速發展&#xff0c;企業面臨著越來越多的數據交換和集成需求。不同系統之間的數據交換變得越來越復雜&#xff0c;而且數據量也越來越大&#xff0c;這對傳統的數據交換方式提出了更高的要求。 中間件作為一種能…

把ROS程序作為桌面圖標雙擊啟動

1 寫launch文件 把ROS程序寫成一個launch文件&#xff0c;例如 powerline_with_rviz.launch <launch><!-- Load camera parameters --><rosparam file"$(find choose_powerline)/config/camera_params.yaml" command"load"/><!-- …

深入理解并應用KTT求解約束性極值問題

KT 很簡單&#xff0c;口訣記心端&#xff0c;等式求最優&#xff0c;不等式驗證——小飛打油 以后每期嘗試編一句口訣&#xff0c;幫助大家記憶&#xff0c;可以是打油詩&#xff0c;也可以是類似“奇變偶不變&#xff0c;符號看象限”的口訣&#xff0c;如果編的不好&#xf…

2024年6月7日第十五周下午學習英語六級大綱

下午學習英語六級大綱的內容可以歸納為以下幾個主要方面&#xff1a; 一、考試概述 六級考試的對象&#xff1a;修完大學英語相應階段課程的在校大學生。考試目的&#xff1a;參照《大學英語教學指南》設定的教學目標&#xff0c;對我國大學生英語綜合運用能力進行科學測量&a…

Docker 常用命令以及鏡像選擇

目錄 1.Docker基本組成 2.鏡像選擇 2.1、鏡像推薦選擇方案 2.2版本選擇 3.Docker 命令 3.1鏡像管理 拉取鏡像&#xff1a; 列出鏡像&#xff1a; 刪除鏡像&#xff1a; 構建鏡像&#xff1a; 3.2容器管理 運行容器 列出運行中的容器和所有容器 停止容器 啟動重啟…

【Qt】QPushButton 與 QAction 的區別

1. QPushButton QPushButton 是一個界面控件&#xff0c;能顯示到界面上的。QPushButton 是 QWidget的一個子類&#xff0c;是一個表示按鈕的界面控件。它用于在GUI中提供一個標準的按鈕&#xff0c;用戶可以點擊它來觸發一個即時的動作或命令。按鈕可以顯示文本、圖標或兩者都…