/codegym.vn/ - 127
0! = 1
n! = n x (n - 1)!; n > 0
Với một số n bất kỳ, việc tính giai thừa của n sẽ được thực hiện như thế nào?
● Nếu n = 0 thì trả về kết quả là 1
● Nếu n = 1 thì trả về kết quả là 1 (bởi vì 1! = 1 x 0!)
● Nếu n = 2 thì trả về kết quả là 2 (bởi vì 2! = 2 x 1!)
● …
● Xét một cách tổng quát, bài toán tính n! sẽ được đưa về thành bài toán tính (n
- 1)!
Hàm tính giai thừa của n có thể được triển khai đơn giản như sau:
1.
function
factorial
(
n
)
{
2.
if
(
n
===
0
)
{
3.
return
1
;
4.
}
5.
return
n
*
factorial
(
n
-
1
);
6.
}
Trong đoạn mã trên, chúng ta dễ dàng nhận thấy rằng hàm factorial() đã thực hiện lời
gọi đến chính nó. Biểu thức n === 0 được gọi là điều kiện dừng (stopping condition)
hoặc là trường hợp cơ sở (base case).
Lưu ý: Chúng ta hoàn toàn có thể sử dụng vòng lặp để tính giai thừa của một số. Ví
dụ được nêu ra ở đây là để giúp chúng ta dễ hình dung về khái niệm hàm đệ quy.
Lưu ý: Cần rất thận trọng khi đặt điều kiện dừng, bởi vì nếu không có điều kiện dừng
hoặc điều kiện dừng không đúng thì có thể dẫn đến tình huống là hàm sẽ được thực
thi vô tận. Thử hình dung xem điều gì sẽ diễn ra nếu chúng ta loại bỏ khối lệnh if trong
hàm factorial() ở trên.
Chúng ta sẽ còn quay lại làm việc với hàm đệ quy ở trong phần Thuật toán tìm kiếm
nhị phân của Chương 7.
8. Mã sạch
Quy tắc #1: Tên hàm cần có ý nghĩa
Như đã biết, hàm được sinh ra để thực hiện một công việc nhất định. Chính vì thế,
tên hàm cần phải là một động từ và mô tả rõ nghĩa nhất về hành động được thực hiện
bên trong đó.
Ví dụ:
Không nên:
1.
function
m
(
firstNumber
,
secondNumber
)
{
2.
// Đoạn mã tính tổng hai tham số
3.
}
Khi nhìn vào tên hàm bên trên chúng ta không thể biết ngay được hàm m() sẽ thực
hiện công việc, hành động gì nếu như chúng ta không đọc vào phần mã bên trong.