Hàm đệ quy (recursive function) trong JavaScript và cách gọi một hàm bên trong chính nó | Laptrinhcanban.com

Hàm đệ quy (recursive function) trong JavaScript và cách gọi một hàm bên trong chính nó

Hướng dẫn cách sử dụng hàm đệ quy (recursive function) trong JavaScript. Bạn sẽ biết hàm đệ quy (recursive function) trong JavaScript là gì, cú pháp sử dụng hàm đệ quy cũng như các sử dụng hàm đệ quy trong JavaScript sau bài học này.

Hàm đệ quy (recursive function) trong JavaScript là gì

Trong JavaScript chúng ta có thể gọi một hàm từ bên trong một hàm khác. Và trong trường hợp một hàm được gọi từ bên trong chính nó thì chúng ta gọi hàm đó là hàm đệ quy (recursive function).

Nói nôm na, hàm đệ quy (recursive function) trong JavaScriptmột hàm được gọi từ bên trong chính nó. Nó có tính chất giống như vòng lặp trong JavaScript, đó là tự nó gọi nó và lặp lại quá trình liên tục mãi mãi.

Hàm đệ quy (recursive function) trong JavaScript

Hàm đệ quy (recursive function) thường được sử dụng kèm theo một hàm điều kiện để kết thúc quá trình lặp khi đã thỏa mãn một điều kiện. Nếu không, tiến trình lặp sẽ kéo dài mãi mãi và hàm đệ quy lúc này sẽ biến thành một vòng lặp vô hạn trong JavaScript.

Cú pháp hàm đệ quy (recursive function) trong JavaScript

Cú pháp hàm đệ quy căn bản

Chúng ta sử dụng hàm đệ quy (recursive function) trong JavaScript với cú pháp sau đây:

function tên_hàm() {
    tên_hàm();
}
tên_hàm();

Ví dụ, chúng ta sẽ gọi hàm tính tổng find_sum() bên trong chính nó như sau:

function find_sum(a,b){
c = a + b;
console.log(c);
find_sum(b,c);
}

find_sum(1,2);

Hàm trên bắt đầu với 2 đối số truyền vào là 1 và 2. Sau đó nó tính tổng hai số này, rồi sử dụng kết quả và tự gọi lại chính nó.

Do hàm đệ quy ở trên không chứa điều kiện dừng lại, nên nó sẽ tự gọi lại nó liên tục và trở thành một vòng lặp vô hạn, với ra kết quả như sau:

3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
......

Cú pháp hàm đệ quy kèm lệnh điều kiện trong JavaScript

Mặc dù không có một luật rõ ràng nào khi viết hàm đệ quy trong JavaScript, tuy nhiên để tránh vô tình tạo phải vòng lặp vô hạn, gây tốn dung lượng và làm chậm chương trình JavaScript thì chúng ta nên sử dụng hàm đệ quy kèm theo lệnh điều kiện để có thể thoát vòng lặp khi điều kiện đã được thỏa mãn.

Ví dụ, chúng ta sử dụng hàm đệ quy kèm theo lệnh if với cú pháp sau đây:

function tên_hàm() {
    if (điều kiện) {
        tên_hàm();
    }

    return;
}
tên_hàm();

Với cú pháp trên, hàm đệ quy sẽ chỉ được gọi lại chính nó trong trường hợp điều kiện của lệnh if thỏa mãn mà thôi.

Ví dụ cụ thể, chúng ta sẽ in ra màn hình dòng chữ javascript 5 lần bằng hàm đệ quy như sau:

function saysomething(n){
console.log("javascript",n);
if(n > 1){
saysomething(n-1);
}
return;
}

saysomething(5);

Kết quả:

javascript 5
javascript 4
javascript 3
javascript 2
javascript 1

Có thể thấy, hàm đệ quy khá giống với vòng lặp for trong JavaScript. Ví dụ trên có thể được viết lại bằng for như sau:

let n = 5
for(let i=n; i>0;i--)
console.log("javascript",i);

Sử dụng hàm đệ quy (recursive function) trong JavaScript

Hàm đệ quy được sử dụng rộng rãi trong JavaScript, từ các phép toán đơn giản như tìm giai thừa của số đến các giải pháp cho các thuật toán phức tạp trong các gã khổng lồ như Facebook hay Google.

Ứng dụng của hàm đệ quy lớn đến mức nào, Kiyoshi sẽ để các bạn tự khám phá. Sau đây Kiyoshi mạn phép chỉ giới thiệu một vài cách sử dụng nho nhỏ và đơn giản của hàm đệ quy trong JavaScript như sau:

Tính giai thừa n trong Javascript

Chúng ta sẽ tính giai thừa n trong JavaScript, ví dụ như giai thừa n của 4 bằng 4*3*2*1 = 24 như sau:

function calc(n){
if (n == 0){
return 1;
}

return n * calc(n - 1);
}

console.log(calc(4));
//> 120

Quy trình thực thi trong hàm sẽ như sau:

  1. Gọi hàm calc(4), do 4 >0 kéo theo calc(3) được gọi
  2. Gọi hàm calc(3), do 3 >0 kéo theo calc(2) được gọi
  3. Gọi hàm calc(2), do 2 >0 kéo theo calc(1) được gọi
  4. Gọi hàm calc(1), do 1 >0 kéo theo calc(0) được gọi
  5. Gọi hàm calc(0), do 0 == 0 nên trả về return 1.
  6. Trả về return 1 * 1.
  7. Trả về return 2 * 1 * 1.
  8. Trả về return 3 *2 * 1 * 1.
  9. Trả về return 4 *3 *2 * 1 * 1.
  10. In kết quả trả về từ hàm là 24 ra màn hình console.

Để tính giá trị trả về từ hàm thì trước hết hàm sẽ được gọi một cách đệ quy cho đến khi biểu thức điều kiện trở thành true. Sau khi hàm đệ quy không còn được gọi nữa, giá trị trả về sẽ được tính theo thứ tự và kết quả cuối cùng được trả về cho chúng ta.

Tính tổng các phần tử trong mảng Javascript

Tương tự như trên, chúng ta có thể tính tổng các phần tử trong mảng Javascript với mã lệnh như sau:

function sum(array) {
if (array.length === 0) {
return 1;
}
const [x, ...xs] = array;
return x + sum(xs);
}
let myarray =[1,10,15,4,30]
console.log(sum(myarray))
//> 61

Trong hàm trên chúng ta đã sử dụng kèm Rest parameters và toán tử 3 chấm trong JavaScript để truyền tham số vào hàm trong JavaScript mà không giới hạn số lượng đối số.

Tính tổng dãy số liên tiếp trong Javascript

Ví dụ cuối cùng sẽ là đơn giản nhất, chúng ta sẽ tính tổng dãy số liên tiếp trong Javascript, ví dụ như tổng 1+2+3+4+..+ = 10 như sau:

let tong = 0;
function findsum(a) {
    if (a > 0) {
        tong += a;
        findsum(a - 1);
    }
}
findsum(100);
console.log(tong);
//> 5050

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về Hàm đệ quy (recursive function) trong JavaScript rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về JavaScript trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.