Thuật toán đệ quy dưới đây tính:
Function Test(a,b:Integer): Integer;
Begin
If (a=0) or (b=0) then Test:=a+b
Else
If a > b then Test:=Test(a-b,b)
Else Test:= Test(a,b-a);
End;
Trả lời:
Đáp án đúng: C
Thuật toán đệ quy trên thực chất là một cách cài đặt của thuật toán Euclid để tìm ước chung lớn nhất (ƯCLN) của hai số nguyên dương a và b.
Giải thích:
* **Trường hợp cơ sở:** Nếu a = 0 hoặc b = 0, thì ƯCLN(a, b) = a + b (vì nếu một trong hai số bằng 0, thì số còn lại là ƯCLN).
* **Bước đệ quy:**
* Nếu a > b, thì ƯCLN(a, b) = ƯCLN(a - b, b).
* Nếu a < b, thì ƯCLN(a, b) = ƯCLN(a, b - a).
* Nếu a = b, thì ƯCLN(a, b) = a = b. Tuy nhiên, trường hợp này không được thể hiện trực tiếp trong code, nhưng nó được xử lý bởi một trong hai bước đệ quy trên khi a và b dần tiến về cùng một giá trị.
Ví dụ: Test(12, 8)
* 12 > 8, Test(12 - 8, 8) = Test(4, 8)
* 4 < 8, Test(4, 8 - 4) = Test(4, 4)
* 4 = 4 (trường hợp này được xử lý bởi một trong hai bước đệ quy: Test(4 - 4, 4) = Test(0,4) = 4+0 =4, hoặc Test(4, 4-4) = Test(4,0) = 4+0 = 4.)
Vậy, thuật toán trên tính ước chung lớn nhất của a và b.





