遞迴和分治法

2021-10-02 20:23:12 字數 1271 閱讀 8889

將問題分解,通過求解區域性性的小問題來解開原本的問題。這種技巧稱為分治法。

int

factorial

(int n)

}return ans;

}

int

factorial

(int n)

面試題 08.06. 漢諾塔問題

在經典漢諾塔問題中,有 3 根柱子及 n

個不同大小的穿孔圓盤,盤子可以滑入任意一根柱子。一開始,所有盤子自上而下按公升序依次套在第一根柱子上(即每乙個盤子只能放在更大的盤子上面)。移動圓盤時受到以下限制:

(1) 每次只能移動乙個盤子;

(2) 盤子只能從柱子頂端滑出移到下一根柱子;

(3) 盤子只能疊在比它大的盤子上。

請編寫程式,用棧將所有盤子從第一根柱子移到最後一根柱子。

你需要原地修改棧。

示例1:

輸入:a = [2, 1, 0], b = , c = 輸出:c = [2, 1, 0]

示例2:

輸入:a = [1, 0], b = , c = 輸出:c = [1, 0]

a中盤子的數量不大於14個

1.首先將n-1個盤子移到b

2.將最大的盤子從a移到c

3.把b上面的n-1個盤子移到c

//首先我們來設計這個函式

void

move

(vector<

int>

&from, vector<

int>

&to, vector<

int>

&swap,

int amount)

else

}

class

solution

void

move

(vector<

int>

&from, vector<

int>

&to, vector<

int>

&swap,

int amount)

else}}

;

返回目錄

遞迴與分治法

分治法設計思想 將乙個規模較大的問題,分解成若干規模較小但問題的性質與原問題相同的子問題,然後將這些子問 題逐個擊破,再將子問題的解合併為原問題的解。基本步驟 1 分解 將原問題分解為若干子問題 2 解決 若問題規模足夠小,可直接解決時,就直接解決 否則,遞迴解決這些子問題 3 合併 將子問題的解合...

遞迴和分治

分治 divide and conquer 是基於多分枝遞迴的一種演算法。簡單的說就是把乙個大問題分解為多個型別相同的子問題,最後把這些子問題的解合併起來就是問題的解。我們看一下典型的遞迴和分治演算法。問題1 插入排序的遞迴演算法 思路 1.首先找到突破點 如果共有n個數,如果前面n 1個都已排序,...

遞迴和分治

在高階語言中,函式自己呼叫和呼叫其他函式並沒有本質的不同。我們把乙個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱作遞迴函式。不過,寫遞迴程式最怕的就是陷入永不結束的無窮遞迴中。切記,每個遞迴定義必須至少有乙個條件,當滿足這個條件時遞迴不再進行,即函式不再呼叫自身而是返回值。比如之前我們...