Ph n 2: dùng stack đ kh thu t tóan đ quy nhánh
Nh chúng ta đã bi t, s th c hi n c a đ quy chính là s th c hi n l i chính b n thânư ế
nó v i d li u nh h n, nên khi g i hàm đ quy thì máy s c p phát m t vùng nh có c ơ ơ
ch ho t đ ng nh Stack (ngăn x p) cho hàm đ quy đó. C ch này ho t đ ng nhế ư ế ơ ế ư
ki u LIFO( last in first out vào sau ra tr c), t c vi c thêm vào hay l y ra đ u th c ướ
hi n thông qua m t đ u ra duy nh t
N u m t ch ng trình con đ qui P(x) đ c g i t ch ng trình chính ta nói ch ngế ươ ượ ươ ươ
trình con đ c th c hi n m c 1. Ch ng trình con này g i chính nó, ta nói đi sâuượ ươ
vào m c 2...cho đ n m t m c k.ràng m c k ph i th c hi n xong thì m c k-1 m i ế
đ c th c hi n ti p t c, hay ta còn nói là ch ng trình con quay v m c k-1.ượ ế ươ
Trong khi m t ch ng trình con t m c i đi vào m c i+1 thì các bi n c c b c a m c i ươ ế
đ a ch c a l nh còn dang d ph i đ c l u tr , đ a ch này g i đ a ch tr v . ượ ư
Khi t m c i+1 quay v m c i các giá tr đó đ c s d ng. Nh v y nh ng bi n c c b ượ ư ế
và đ a ch l u sau đ c dùng tr c. Tính ch t này g i ý cho ta dùng m t stack đ l u gi ư ượ ướ ư
các giá tr c n thi t c a m i l n g i t i ch ng trình con nh ế ươ ư bi n c c b , các tham sế .
M i khi lùi v m t m c thì các giá tr này đ c l y ra đ ti p t c th c hi n m c này. Ta ượ ế
tóm t t quá trình:
 B óc 1: T o 1 stack r ng ư
 B óc 2: L u các tham s hình th c m c 1 vào stack.ư ư
 B c 3: L p cho đ n khi stack r ng ướ ế
1. L y ra 1 ph n t X kh i stack
Vào sau
Vào tr cướ
vào ra
Đ nh
Stack(Ngăn x pế)
2. N u X tho đi u ki n d ng c a đ qui (NEO) thì x lý d li uế
Ng c l i (ph n đ qui) ượ
X lý theo thu t tóan
Xác đ nh l i g i đ quy v i các tham s t ng ng ươ
n p các tham s đó vào stack
 B c 4: K t thúc thu t toánướ ế
M t s ví d v dùng Stack đ kh đ qui
Ví d 1: Bài toán Tháp Hà N i
Có ba c c A,B,C. Kh i đ u c c A có m t s đĩa x p theo th t nh d n lên trên đ nh. ế
Bài toán đ t ra là ph i chuy n toàn b ch ng đĩa t A sang C. M i l n th c hi n chuy n
m t đĩa t m t c c sang m t c c khác và không đ c đ t đĩa l n n m trên đĩa nh ượ
Phân tích bài toán:
Tr ng h p 1 đĩa: Chuy n th ng t A sang C. Đây là tr ng h p suy bi n ườ ườ ế
Tr ng h p 2 đĩa: ườ Chuy n 1 đĩa t A sang B
Chuy n 1 đĩa t A sang C
Chuy n 1 đĩa t B sang C
Tr ng h p chung n>1 đĩa; Ta coi n-1 đĩa trên nh là 1 đĩa và ta áp d ng trong tr ngườ ư ườ
h p 2 đĩa
Chuy n n-1 đĩa t A sang B ( dùng c c C làm trung gian)
Chuy n 1 đĩa t A sang C
Chuy n n-1 đĩa t B sang C (dùng c c A làm trung gian)
thu t toán đ qui mô ph ng nh sau: ư
Proc Move(n,A,B,C) // Chuy n n đĩa t c c A sang c c C
If n=1 Then
chuy n (A,’’,C)
Else { Call Move(n-1, A, C, B)
Call Move(1, A, B, C)
Call Move(n-1, B, A, C)
}
Return
Quá trình th c hi n ch ng trình con đ c minh ho v i 3 đĩa (n=3) nh sau: ươ ượ ư
Move(1,A,B,C) A->B
Move(2,A,C,B) Move(1,A,C,B) A->C
Move(1,B,C,A) B->C
move(3,A,B,C) Move(1,A,B,C) A->B
Move(1,C,A,B) C->A
Move(2,C,B,A) Move(1,C,B,A) C->B
Move(1,A,B,C) A->B
M c 1m c 2m c 3
Cây đ quy trên đ c mô ph ng qua vi c dùng stack đ gi i quy t nh sau: ượ ế ư
(3,A,B,C) (2,A,C,B) Quá trình chuy n đĩa
(2,B,A,C)
T đây, ta xây d ng c u trúc c a m i ph n t đ c l u trong stack đ gi i quy t bài ượ ư ế
toán tháp Hà n i nh sau: ư
struct Item_Tower{
int num; // s đĩa
char sour, midl, dest;
void assign(int n, char a, char b, char c){ // hàm gán t ng giá tr cho các thu c tính
num = n; sour = a; midl = b, dest = c;
}
};
Thu t toán kh đ qui
3 A B C
A->C
A->B
C->B
A->C
B->A
B->C
A->C
2ACB1ABC2BAC 1ABC1ACB1CAB
1ABC2BAC
2BAC 1BCA1BAC1ABC
void haNoi_Tower(int n, char a, char b, char c){
Stack<Item_Tower> sTower; // Khai báo stack ki u Item_Tower
Item_Tower t;
int d = 0;
t.assign(n, a, b, c);
sTower.push(t);
while (sTower.isEmpty() == false){
Item_Tower temp = sTower.topOfStack();
sTower.pop();
if(temp.num == 1) cout<<" \n "<<++d<<" ."<<temp.sour <<" ----->"<<temp.dest;
else{
t.assign(temp.num-1, temp.midl, temp.sour, temp.dest);
sTower.push(t);
t.assign(1, temp.sour, temp.midl, temp.dest);
sTower.push(t);
t.assign(temp.num - 1, temp.sour, temp.dest, temp.midl);
sTower.push(t);
}
}
}
Ví d 2: Ph bàn c kích th c 2 ướ n * 2n b ng các con tromino
Yêu c u: bàn c kích th c 2 ướ n * 2n (n nguyên >0). Đánh d u 1 ô b t kỳ trên bàn c ,
sau đó dùng các con tromino ph đ y bàn c .