THINK JAVA: CÁCH SUY NGHĨ NHƯ NHÀ KHOA HỌC MÁY TÍNH - Trang 128

Quay tr l i v i c bài, n u ta bi t r ng các lá bài đã đ

c x p th t , thì ta có th vi t m t phiên b n

ở ạ ớ ỗ

ế

ế ằ

ượ ế

ứ ự

ể ế

khác findCard, nh ng ch y nhanh h n. Cách t t nh t đ vi t ph

ng th c tìm ki m chia đôi là dùng

ư

ơ

ấ ể ế

ươ

ế

cách đ quy, b i vi c chia đôi v b n ch t là mang tính đ quy.

ề ả

M t m o là vi t m t ph

ng th c có tên

ế

ươ

findBisect trong đó nh n vào tham s là hai ch s ,

ỉ ố low và high,

quy đ nh đo n trong m ng c n đ

c tìm ki m (bao g m c

ượ

ế

ả low và high).

1.

Đ tìm ki m trên m ng, hãy ch n m t ch s gi a

ế

ỉ ố ữ low và high (g i nó là

mid) r i so sánh nó v i lá bài

c n tìm.

2. N u b n đã tìm th y nó thì d ng l i.

ế

3.

N u lá bài t i

ế

ạ mid cao h n lá bài c n tìm, thì tìm ki m trong kho ng t

ơ

ế

ừ low đ n

ế mid-1.

4.

N u lá bài t i

ế

ạ mid th p h n lá bài c n tìm, thì tìm ki m trong kho ng t

ơ

ế

ừ mid+1 đ n

ế high.

Các b

c 3 và 4 trông gi ng nh ng l i g i đ quy đ n m c đáng ng . Sau đây là toàn b ý t

ng khi

ướ

ờ ọ ệ

ế

ưở

chuy n thành mã l nh Java:

public static int

findBisect(Card[] cards, Card card,

int

low,

int

high) {

// CẦN LÀM: một trường hợp cơ sở

int

mid = (high + low) / 2;

int

comp = compareCard(cards[mid], card);

if

(comp == 0) {

return

mid;

}

else if

(comp > 0) {

return

findBisect(cards, card, low, mid-1);

}

else

{

return

findBisect(cards, card, mid+1, high);

}

}

Mã l nh này có ch a ph n c t lõi c a phép tìm ki m chia đôi, song v n thi u m t ph n trong tr ng, đó

ầ ố

ế

ế

là lý do mà tôi đã ghi chú “C N LÀM”. Nh đã vi t, ph

ng th c này s l p đ quy mãi mãi n u nh lá

ư

ế

ươ

ẽ ặ

ế

ư

bài không có trong c . Ta c n m t tr

ng h p c b n đ x lý tình hu ng này.

ườ

ợ ơ ả

ể ử

N u

ế high nh h n

ỏ ơ low, thì không có lá bài nào gi a chúng, b i v y ta s k t lu n r ng lá bài c n tìm

ở ậ

ẽ ế

ậ ằ

không có trong c . N u ta x lý đ

c tr

ng h p đó, thì ph

ng th c s ho t đ ng đúng:

ỗ ế

ượ

ườ

ươ

ứ ẽ

ạ ộ

public static int

findBisect(Card[] cards, Card card,

int

low,

int

high) {

System.out.println(low +

", "

+ high);

if

(high < low)

return

-1;

int

mid = (high + low) / 2;

int

comp = compareCard(cards[mid], card);

if

(comp == 0) {

return

mid;

}

else if

(comp > 0) {

return

findBisect(cards, card, low, mid-1);

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.