日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回溯法(其实是递归)

發布時間:2024/10/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯法(其实是递归) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于回溯算法,你該了解這些!別看回溯法很難,但回溯法就是暴力解法?https://mp.weixin.qq.com/s?__biz=MzUxNjY5NTYxNA==&mid=2247485237&idx=1&sn=1bae4c3d0d3965af44878093a5a49f58&scene=21#wechat_redirect其中博主這段話令我領悟了回溯法的精髓,要懂回溯,首先要明白我們為什么要用回溯?

力扣題目鏈接:https://leetcode-cn.com/problems/combinations/

給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。

示例: 輸入:?n = 4, k = 2 輸出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

直接的解法當然是使用for循環,例如示例中k為2,很容易想到 用兩個for循環,這樣就可以輸出 和示例中一樣的結果。

int n = 4; for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {cout << i << " " << j << endl;} }

輸入:n = 100, k = 3 那么就三層for循環,代碼如下:

int n = 100; for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {for (int u = j + 1; u <= n; n++) {cout << i << " " << j << " " << u << endl;}} }

如果n為100,k為50呢,那就50層for循環,是不是開始窒息

此時就會發現雖然想暴力搜索,但是用for循環嵌套連暴力都寫不出來!

咋整?

回溯搜索法來了,雖然回溯法也是暴力,但至少能寫出來,不像for循環嵌套k層讓人絕望。

那么回溯法怎么暴力搜呢?

上面我們說了要解決 n為100,k為50的情況,暴力寫法需要嵌套50層for循環,那么回溯法就用遞歸來解決嵌套層數的問題

遞歸來做層疊嵌套(可以理解是開k層for循環),每一次的遞歸中嵌套一個for循環,那么遞歸就可以用于解決多層嵌套循環的問題了

此時遞歸的層數大家應該知道了,例如:n為100,k為50的情況下,就是遞歸50層。

一些同學本來對遞歸就懵,回溯法中遞歸還要嵌套for循環,可能就直接暈倒了!

如果腦洞模擬回溯搜索的過程,絕對可以讓人窒息,所以需要抽象圖形結構來進一步理解。

我們在關于回溯算法,你該了解這些!中說道回溯法解決的問題都可以抽象為樹形結構(N叉樹),用樹形結構來理解回溯就容易多了

那么我把組合問題抽象為如下樹形結構:

組合問題!https://mp.weixin.qq.com/s?__biz=MzUxNjY5NTYxNA==&mid=2247494135&idx=2&sn=3a17829d16a597246c20600a3a4bb2ce&chksm=f9a1daa6ced653b0a6fd720febab7a48df94090d44b1a686431b094e0d602f5d89fc1bd65744&scene=178&cur_album_id=1607983171550167042#rd?

?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的回溯法(其实是递归)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。