所謂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 分治法入門之二分查詢 分治法 二分查詢 ...