回溯法中的恢復(fù)現(xiàn)場(chǎng),是在遞歸的每一步都恢復(fù),還是在遞歸完成后恢復(fù)
結(jié)合代碼理解的過(guò)程發(fā)現(xiàn),有恢復(fù)現(xiàn)場(chǎng)的代碼存在,是如何把結(jié)果打印下來(lái)的
if depth == len(data_list)+1:
? ? ? ? print(arranges)
? ? ? ? global total
? ? ? ? total += 1
? ? else:
? ? ? ? for data in datas:
? ? ? ? ? ? #1. 設(shè)置現(xiàn)場(chǎng)
? ? ? ? ? ? arranges.append(data)
? ? ? ? ? ? #2. 遞歸
? ? ? ? ? ? next_datas = datas[:]
? ? ? ? ? ? next_datas.remove(data)
? ? ? ? ? ? search(depth+1, next_datas)
? ? ? ? ? ? #3. 恢復(fù)現(xiàn)場(chǎng)
? ? ? ? ? ? arranges.pop()
這里恢復(fù)現(xiàn)場(chǎng)不是把a(bǔ)rranges.pop掉了,這樣遞歸完成后arranges應(yīng)該是空列表了把,? ?為什么print(arranges)的時(shí)候還能打印出來(lái)呢
2020-03-04
注意arranges.pop()或者說(shuō)pop()這個(gè)函數(shù)只會(huì)彈出數(shù)組的最后一個(gè)元素,也就是說(shuō)會(huì)去掉你選的(遞歸開始的地方)上一個(gè)元素。所以遞歸完成后不一定是空列表。比如[1,2,3]? #1設(shè)置現(xiàn)場(chǎng) arrange = [1,2] #2.遞歸 next_datas = [3], 這一步也就只有一個(gè)元素可選,直接一種可能[1,2,3] ,#3 恢復(fù)現(xiàn)場(chǎng) arrange = [1],繼續(xù)設(shè)置下一個(gè)現(xiàn)場(chǎng)為[1,3]....