JavaScript is required

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;

A.

Tính hiệu 2 số a và b

B.

Tìm số dư trong phép chia a cho b

C.

Tìm ước chung lớn nhất của a và b

D.

Tìm bội chung nhỏ nhất của a và b

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.

Câu hỏi liên quan