国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解

這篇具有很好參考價(jià)值的文章主要介紹了【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs
【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

個(gè)人主頁(yè):??在肯德基吃麻辣燙
我的gitee:C++倉(cāng)庫(kù)
個(gè)人專(zhuān)欄:C++專(zhuān)欄

前言

從本文開(kāi)始進(jìn)入遞歸,搜索與回溯算法專(zhuān)題講解。



一、名詞解釋

1、什么是遞歸?

遞歸就是函數(shù)自己調(diào)用自己。


2、為什么會(huì)用到遞歸?

遞歸的本質(zhì)是:

主問(wèn)題:—>相同的子問(wèn)題
子問(wèn)題:—>相同的子問(wèn)題

3、如何理解遞歸?

通過(guò):

  • 1)通過(guò)遞歸的細(xì)節(jié)展開(kāi)圖(前期可以,過(guò)了前期一定不能再用了)
  • 2)通過(guò)二叉樹(shù)中的題目
  • 3)宏觀(guān)看待遞歸問(wèn)題(重要)

越往后學(xué)越發(fā)現(xiàn),如果只抓住遞歸的細(xì)節(jié)展開(kāi)圖,你會(huì)發(fā)現(xiàn)你根本就學(xué)不好遞歸這個(gè)東西,遞歸的細(xì)節(jié)展開(kāi)圖只是為了輔助你讀過(guò)新手期,如果你后面還在用它,那么你往往是學(xué)不好遞歸的。

那么:如何理解宏觀(guān)看待遞歸問(wèn)題這個(gè)點(diǎn)呢?

可以分為幾個(gè)部分:

    • 1)不要再在意遞歸的細(xì)節(jié)展開(kāi)圖
    • 2)把遞歸的函數(shù)當(dāng)成一個(gè)黑盒子
    • 3)相信這個(gè)黑盒子一定能完成這個(gè)任務(wù)

4、如何寫(xiě)好遞歸?

寫(xiě)好一個(gè)遞歸也分為三點(diǎn):

  • 1)先找到相同的子問(wèn)題(函數(shù)頭的設(shè)計(jì))
  • 2)只關(guān)心某一個(gè)子問(wèn)題是如何解決的(函數(shù)體的書(shū)寫(xiě))
  • 3)遞歸出口

二、搜索vs深度優(yōu)先遍歷vs深度優(yōu)先搜索vs寬度優(yōu)先遍歷vs寬度優(yōu)先搜索vs暴搜

1、深度優(yōu)先遍歷vs深度優(yōu)先搜索

其實(shí),一句話(huà)就能概括下來(lái):
遍歷是形式,搜索是目的。

所以,我們平時(shí)說(shuō)的深度優(yōu)先遍歷和深度優(yōu)先搜索,其實(shí)他們倆是一樣的。
都可以叫做dfs。

2、寬度優(yōu)先遍歷vs寬度優(yōu)先搜索

其實(shí),一句話(huà)就能概括下來(lái):
遍歷是形式,搜索是目的。

所以,我們平時(shí)說(shuō)的寬度優(yōu)先遍歷和寬度優(yōu)先搜索,其實(shí)他們倆是一樣的。
都可以叫做bfs。

3、關(guān)系圖

我們所說(shuō)的搜索,其實(shí)就是暴搜。
【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

4. 搜索問(wèn)題的拓展

我們剛開(kāi)始學(xué)習(xí)搜索時(shí),總以為dfsbfs這兩個(gè)搜索都只與二叉樹(shù)有關(guān)。其實(shí)不然。
從下面的例題開(kāi)始你會(huì)發(fā)現(xiàn),很多東西都能使用dfs進(jìn)行求解。

三、回溯與剪枝

這兩個(gè)名詞聽(tīng)起來(lái)貌似很高大上,其實(shí)用一個(gè)例子就能解釋清楚了。

下面來(lái)看一個(gè)迷宮問(wèn)題:

【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

入口和出口如上:我們從入口出發(fā),往右邊走遇到墻壁之后,往下走。走到藍(lán)色標(biāo)記,也就是拐角點(diǎn)的地方后,這就是一個(gè)岔路口,此時(shí)我們有兩種選擇:

  • 1)往左邊走
  • 2)往右邊走

當(dāng)我們選擇往左邊走時(shí),如下圖:
【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs
會(huì)遇到墻壁,此時(shí)我們就需要原路返回

這個(gè)從某一位置出發(fā),一條道走到黑,再沿著原路返回的過(guò)程,就叫做回溯。

回溯的這條路徑,我們用綠色來(lái)標(biāo)記。
【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs
此時(shí)又走到了藍(lán)色拐點(diǎn),在這個(gè)岔路口我們有三種選擇:
1)往上走
2)往左走
3)往右走

可是,我們最初是從上面下來(lái)的,然后沿著左邊走,走不通之后再返回來(lái)的。
所以,我們只有一個(gè)選擇:往右走。

而這個(gè)判斷的過(guò)程,也就是選擇路徑的過(guò)程,就叫做剪枝。

將往上走的路徑剪掉,將往左走的路徑剪掉,就是剪枝。

四、專(zhuān)題一

1. 漢諾塔問(wèn)題

點(diǎn)我直達(dá)

【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

算法分析

1.找到相同的子問(wèn)題:


當(dāng)n = 1時(shí):

【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

直接將盤(pán)子從A柱子挪到C柱子即可。


當(dāng)n = 2 時(shí)

【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs
分為三步走:

1)我們需要將盤(pán)子a上面的盤(pán)子借助C柱子移動(dòng)到B柱子。
【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

2)將a盤(pán)子移動(dòng)到C柱子上
【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs
3)將B柱子上的所有盤(pán)子借助A盤(pán)子移動(dòng)到C柱子上。

【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs


當(dāng)n = 3 時(shí)
【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

與第二步相同:
分為三步走
1)將a盤(pán)子上面的所有盤(pán)子借助C柱子移動(dòng)到B柱子上。
【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

2)將a盤(pán)子移動(dòng)到C柱子上。
【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

3)將B柱子上面的所有盤(pán)子借助A柱子移動(dòng)到C柱子上。

【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解,遞歸+搜索+回溯算法專(zhuān)題,算法,c++,深度優(yōu)先,dfs

2.只關(guān)心某一個(gè)子問(wèn)題如何解決。

所以我們會(huì)發(fā)現(xiàn),當(dāng)n >= 2時(shí),都會(huì)執(zhí)行相同的子問(wèn)題的操作。操作如下:

  • 1)將a盤(pán)子上面的所有盤(pán)子通過(guò)C柱子挪到B柱子上。
  • 2)將a盤(pán)子挪到C盤(pán)子上。
  • 3)將B柱子上面的所有盤(pán)子挪到C柱子上。

在這整個(gè)過(guò)程中,你要相信一件事情:
你交給dfs這個(gè)函數(shù)的任務(wù)是:

我要把所有盤(pán)子全部借助一個(gè)柱子挪到另一個(gè)柱子上。

并且要相信dfs這個(gè)函數(shù)一定能完成這個(gè)任務(wù)。

這就是宏觀(guān)看待問(wèn)題的思路。

3.遞歸出口
遞歸出口就是當(dāng)n = 1時(shí),你會(huì)發(fā)現(xiàn)跟當(dāng)n = 其他數(shù)的操作步驟是不一樣的。
當(dāng)n = 1時(shí),直接將a盤(pán)子移動(dòng)到C柱子即可。

代碼編寫(xiě)

class Solution {
public:
//1.重復(fù)的子問(wèn)題(函數(shù)頭)
//要將A柱子上面的所有盤(pán)子借助B柱子全部轉(zhuǎn)移到C柱子上面

//2.只關(guān)心某一個(gè)子問(wèn)題在做什么(函數(shù)體)

//3.遞歸出口

    void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int n) 
    {
        if(n == 1)
        {
            C.push_back(A.back());
            A.pop_back();
            return;
        }

        dfs(A,C,B,n-1);
        C.push_back(A.back());
        A.pop_back();
        dfs(B,A,C,n-1);
    }
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) 
    {
        int n = A.size();
        dfs(A,B,C,n);
    }
};

總結(jié)

提示:這里對(duì)文章進(jìn)行總結(jié):

本文章詳細(xì)講解了遞歸,搜索與回溯算法的入門(mén)理解級(jí)操作,以及通過(guò)一道例題感受一下dfs這種算法的強(qiáng)大之處,關(guān)鍵在于dfs寫(xiě)起來(lái)特別簡(jiǎn)單。

學(xué)好dfs,是進(jìn)入大廠(chǎng)的必備技能。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-705211.html

到了這里,關(guān)于【C++】遞歸,搜索與回溯算法入門(mén)介紹和專(zhuān)題一講解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 專(zhuān)題二:二叉樹(shù)的深搜【遞歸、搜索、回溯】

    專(zhuān)題二:二叉樹(shù)的深搜【遞歸、搜索、回溯】

    深度優(yōu)先遍歷 (DFS,全稱(chēng)為DepthFirstTraversal),是我們樹(shù)或者圖這樣的數(shù)據(jù)結(jié)構(gòu)中常用的?種遍歷算法。這個(gè)算法會(huì)盡可能深的搜索樹(shù)或者圖的分?,直到?條路徑上的所有節(jié)點(diǎn)都被遍歷完畢,然后再回溯到上?層,繼續(xù)找?條路遍歷。 在?叉樹(shù)中,常?的深度優(yōu)先遍歷為:

    2024年02月07日
    瀏覽(21)
  • 【算法系列篇】遞歸、搜索與回溯(一)

    【算法系列篇】遞歸、搜索與回溯(一)

    遞歸算法是一種通過(guò)重復(fù)將問(wèn)題分解為同類(lèi)的子問(wèn)題而解決問(wèn)題的方法。遞歸式方法可以被用于解決很多的計(jì)算機(jī)科學(xué)問(wèn)題,因此它是計(jì)算機(jī)科學(xué)中十分重要的一個(gè)概念。絕大多數(shù)編程語(yǔ)言支持函數(shù)的自調(diào)用,在這些語(yǔ)言中函數(shù)可以通過(guò)調(diào)用自身來(lái)進(jìn)行遞歸。 搜索算法是利用

    2024年02月04日
    瀏覽(24)
  • 【算法系列篇】遞歸、搜索和回溯(二)

    【算法系列篇】遞歸、搜索和回溯(二)

    前面為大家介紹了關(guān)于遞歸的知識(shí),以及使用遞歸解決了幾個(gè)問(wèn)題,那么這篇文章將帶大家鞏固一下關(guān)于遞歸的知識(shí)。 https://leetcode.cn/problems/swap-nodes-in-pairs/description/ 給你一個(gè)鏈表,兩兩交換其中相鄰的節(jié)點(diǎn),并返回交換后鏈表的頭節(jié)點(diǎn)。 你必須在不修改節(jié)點(diǎn)內(nèi)部的值的情況

    2024年02月05日
    瀏覽(21)
  • 【算法系列篇】遞歸、搜索和回溯(三)

    【算法系列篇】遞歸、搜索和回溯(三)

    前面我已經(jīng)給大家分享了兩篇關(guān)于遞歸、搜索和回溯相關(guān)的問(wèn)題,但是前面兩篇只涉及到了遞歸,搜索和回溯基本還沒(méi)涉及到,大家先別著急,后面的文章會(huì)為大家分享關(guān)于搜索和回溯相關(guān)的知識(shí)和題目。今天這篇文章主要涉及到的就是關(guān)于在遞歸過(guò)程中的剪枝問(wèn)題。 二叉樹(shù)

    2024年02月04日
    瀏覽(20)
  • 【算法系列篇】遞歸、搜索和回溯(四)

    【算法系列篇】遞歸、搜索和回溯(四)

    前面我們通過(guò)幾個(gè)題目基本了解了解決遞歸類(lèi)問(wèn)題的基本思路和步驟,相信大家對(duì)于遞歸多多少少有了更加深入的了解。那么本篇文章我將為大家分享結(jié)合決策樹(shù)來(lái)解決遞歸、搜索和回溯相關(guān)的問(wèn)題。 決策樹(shù)是一種基本的分類(lèi)與回歸方法。在分類(lèi)問(wèn)題中,決策樹(shù)通過(guò)構(gòu)建一棵

    2024年02月04日
    瀏覽(19)
  • 【算法】遞歸、回溯、剪枝、dfs 算法題練習(xí)(組合、排列、總和問(wèn)題;C++)

    【算法】遞歸、回溯、剪枝、dfs 算法題練習(xí)(組合、排列、總和問(wèn)題;C++)

    后面的練習(xí)是接著下面鏈接中的文章所繼續(xù)的,在對(duì)后面的題練習(xí)之前,可以先將下面的的文章進(jìn)行了解??: 【算法】{畫(huà)決策樹(shù) + dfs + 遞歸 + 回溯 + 剪枝} 解決排列、子集問(wèn)題(C++) 思路 題意分析 :要求根據(jù)給出的數(shù)字,算出合法的括號(hào)組成個(gè)數(shù)。根據(jù)題目,我們可以總

    2024年02月22日
    瀏覽(24)
  • DSt:數(shù)據(jù)結(jié)構(gòu)的最強(qiáng)學(xué)習(xí)路線(xiàn)之?dāng)?shù)據(jù)結(jié)構(gòu)知識(shí)講解與刷題平臺(tái)、刷題集合、問(wèn)題為導(dǎo)向的十大類(lèi)刷題算法(數(shù)組和字符串、棧和隊(duì)列、二叉樹(shù)、堆實(shí)現(xiàn)、圖、哈希表、排序和搜索、動(dòng)態(tài)規(guī)劃/回溯法/遞歸/貪心/分治)總

    Algorithm:【算法進(jìn)階之路】之算法面試刷題集合—數(shù)據(jù)結(jié)構(gòu)知識(shí)和算法刷題及其平臺(tái)、問(wèn)題為導(dǎo)向的十大類(lèi)刷題算法(數(shù)組和字符串、鏈表、棧和隊(duì)列、二叉樹(shù)、堆、圖、哈希表、排序和搜索、回溯算法、枚舉/遞歸/分治/動(dòng)態(tài)規(guī)劃/貪心算法)總結(jié) 目錄 相關(guān)文章

    2024年02月08日
    瀏覽(34)
  • 遞歸專(zhuān)題訓(xùn)練詳解(回溯,剪枝,深度優(yōu)先)

    遞歸專(zhuān)題訓(xùn)練詳解(回溯,剪枝,深度優(yōu)先)

    在經(jīng)典漢諾塔問(wèn)題中,有 3 根柱子及 N 個(gè)不同大小的穿孔圓盤(pán),盤(pán)子可以滑入任意一根柱子。一開(kāi)始,所有盤(pán)子自上而下按升序依次套在第一根柱子上(即每一個(gè)盤(pán)子只能放在更大的盤(pán)子上面)。移動(dòng)圓盤(pán)時(shí)受到以下限制: (1) 每次只能移動(dòng)一個(gè)盤(pán)子; (2) 盤(pán)子只能從柱子頂端滑出

    2024年02月07日
    瀏覽(27)
  • c++詳解遞歸算法-全網(wǎng)最全+例題講解

    c++詳解遞歸算法-全網(wǎng)最全+例題講解

    什么是遞歸? 遞歸的思想是什么? 什么時(shí)候該用遞歸? 使用遞歸需要注意哪些問(wèn)題? 遞歸思想解決經(jīng)典問(wèn)題 遞歸和循環(huán)的區(qū)別是什么? 遞歸算法: 定義:直接或間接地出現(xiàn)對(duì)自身的調(diào)用 本質(zhì):遞歸即 遞進(jìn) 與 回歸, 基本思想就是把規(guī)模大的問(wèn)題轉(zhuǎn)化為規(guī)模小的相似的子

    2024年02月07日
    瀏覽(20)
  • 遞歸回溯兩個(gè)例題:1.數(shù)組組合 2.在矩陣中搜索單詞

    遞歸回溯兩個(gè)例題:1.數(shù)組組合 2.在矩陣中搜索單詞

    題目1:組合 給定兩個(gè)整數(shù) n 和 k ,返回范圍 [1, n] 中所有可能的 k 個(gè)數(shù)的組合。 你可以按 任何順序 返回答案。 輸入:n = 4, k = 2 輸出: [ ? [2,4], ? [3,4], ? [2,3], ? [1,2], ? [1,3], ? [1,4], ] ?解題思路: 1.定義一個(gè)temp數(shù)組,存放臨時(shí)的組合結(jié)果 2.兩種選擇:1.選擇當(dāng)前元素2.不選

    2024年02月15日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包