回溯遞迴的思路

2022-06-26 10:54:09 字數 745 閱讀 1587

所謂backtracking都是這樣的思路:在當前局面下,你有若干種選擇。那麼嘗試每一種選擇。如果已經發現某種選擇肯定不行(因為違反了某些限定條件),就返回;如果某種選擇試到最後發現是正確解,就將其加入解集

所以你思考遞迴題時,只要明確三點就行:選擇 (options),限制 (restraints),結束條件 (termination)。即「ort原則」(這個是我自己編的)

對於generate parentheses,在任何時刻,你都有兩種選擇:

1. 加左括號。

2. 加右括號。

同時有以下限制:

1. 如果左括號已經用完了,則不能再加左括號了。

2. 如果已經出現的右括號和左括號一樣多,則不能再加右括號了。因為那樣的話新加入的右括號一定無法匹配。

結束條件是:

左右括號都已經用完。

結束後的正確性:

左右括號用完以後,一定是正確解。因為1. 左右括號一樣多,2. 每個右括號都一定有與之配對的左括號。因此一旦結束就可以加入解集(有時也可能出現結束以後不一定是正確解的情況,這時要多一步判斷)。

遞迴函式傳入引數:

限制和結束條件中有「用完」和「一樣多」字樣,因此你需要知道左右括號的數目。

當然你還需要知道當前局面sublist和解集res。

因此,把上面的思路拼起來就是**:

if (左右括號都已用完)

//否則開始試各種選擇

if (還有左括號可以用)

if (右括號小於左括號)

回溯思路 請忽略

這個是我的乙個思路回溯,對於讀者沒有任何意義。僅僅是我個人用來整理收穫的。我最近白天一直想寫一些東西,但是晚上做到電腦前又想不起來寫什麼。這個就是用來起個頭,後面一段時間就知道怎麼做了。第三階段,後來發現展示面板上的中文有些影響美觀,決定同意採用從url中擷取網域名稱引數作為使用者id。使用getr...

迷宮回溯 遞迴

1.什麼是遞迴?自己呼叫自己,每次傳入的方法引數不同。2.需求 終止條件,和遞迴規律 package com public class mul 設定擋板 map 3 1 1 map 3 2 1 map 1 2 1 map 4 4 1 map 4 5 1 列印地圖 for int a map syst...

遞迴和回溯

經典遞迴題目 漢諾塔問題 1 include 2 using namespace std 3 x為起點,y為跳板,z為終點 4void hannuota int n,char x,char y,char z 13 1415 intmain view code 分治法入門之二分查詢 分治法 二分查詢 ...