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

theo cách b t kì, mi n là h p lý. Ý t

ng này đ

c

ưở

ượ Alonzo Church và Alan Turing phát tri n, b i v y nó

ở ậ

còn mang tên lu n án Church-Turing. B n có th đ c thêm thông tin

ể ọ

ởhttp://en.wikipedia.org/wiki/Turing_thesis.

Đ c th hoá tác d ng c a nh ng ki n th c l p trình mà b n v a đ

c h c, chúng ta hãy cùng l p m t

ể ụ ể

ế

ứ ậ

ượ ọ

s hàm toán h c theo cách đ quy. M t đ nh nghĩa đ quy gi ng nh vi c đ nh nghĩa vòng quanh; đi m

ộ ị

ư ệ ị

t

ng đ ng là trong ph n đ nh nghĩa l i có tham chi u đ n s v t đ

c đ nh nghĩa. Nh ng cách đ nh

ươ

ế

ế ự ậ ượ ị

ư

nghĩa vòng quanh th c s thì không m y có tác d ng:

ự ự

đ quy:

m t tính t đ ch m t ph ng th c mang tính đ quy.

ừ ể ỉ ộ

ươ

B n h n s b c mình khi th y m t đ nh nghĩa ki u nh v y trong cu n t đi n. Ng

c l i, khi b n xem

ẳ ẽ ự

ộ ị

ư ậ

ố ừ ể

ượ ạ

đ nh nghĩa v hàm

giai th a

trong toán h c, có th b n s th y:

ể ạ ẽ ấ

0! = 1
n! = n ·(n−1)!

(Giai th a th

ng đ

c kí hi u b i d u !, xin đ ng nh m v i toán t logic

ườ

ượ

ở ấ

! v i ý nghĩa NOT.) Đ nh

nghĩa này phát bi u r ng giai th a c a 0 là 1, và giai th a c a b t kì m t giá tr nào khác,

ể ằ

ừ ủ

ừ ủ

n, thì

b ng

n nhân v i giai th a c a

ừ ủ n - 1.

    Theo đó, 3! b ng 3 nhân v i

ớ 2!, v n l i b ng 2 nhân v i

ố ạ ằ

ớ 1!, v n b ng

1 nhân v i

ớ 0!. G p t t c l i, ta có

ộ ấ ả ạ

3! b ng 3 nhân 2 nhân 1 nhân 1, t c là b ng 6.

N u b n có th phát bi u m t đ nh nghĩa có tính đ quy cho m t hàm nào đó thì b n cũng có th vi t

ế

ộ ị

ể ế

m t ph

ng th c Java đ tính nó. B

c đ u tiên là xác đ nh các tham s và ki u d li u c a giá tr tr

ươ

ướ ầ

ữ ệ ủ

ị ả

l i. Vì giai th a đ

c đ nh nghĩa cho các s nguyên, nên ph

ng th c c n vi t s nh n tham s là s

ượ ị

ươ

ứ ầ

ế ẽ

nguyên r i tr l i cũng m t s nguyên:

ả ạ

ộ ố

public static int

factorial(

int

n) {

}

N u đ i s b ng 0, chúng ta ch c n tr l i giá tr 1:

ế

ố ố ằ

ỉ ầ

ả ạ

public static int

factorial(

int

n) {

if

(n == 0) {

return

1;

}

}

Đó là tr

ng h p c s .

ườ

ợ ơ ở

N u đi u đó không x y ra (đây chính là ph n hay nh t), chúng ta th c hi n l i g i đ quy đ tính giai

ế

ệ ờ ọ ệ

th a c a

ừ ủ n - 1

    và sau đó nhân nó v i

n.

public static int

factorial(

int

n) {

if

(n == 0) {

return

1;

}

else

{

int

recurse = factorial(n-1);

int

result = n * recurse;