JavaScript Exercise: Recursion (Bài tập 3)

Write a JavaScript program to get the integers in range (x, y).
Example : range(2, 9)
Expected Output : [3, 4, 5, 6, 7, 8]

Hôm nay chúng ta sẽ tiếp tục làm ví dụ với cách giải đệ quy. Hãy viết bằng JavaScript để in ra mảng số nguyên trong khoảng (x, y) cho trước. Ví dụ ranger(2, 9) thì hiển thị ra mảng [3, 4, 5, 6, 7, 8];

Tính chất đệ quy ta đã bàn ở trước là hàm đó gọi chính nó, và trong hàm đó phải có điều kiện để ngắt (thoát) khỏi đệ quy nếu ko hàm nó tự gọi nó chạy mãi mãi ko điểm dừng mất.
Ở đây ta sẽ được truyền vào hàm giới hạn hai số x, y, và trong hàm thực hiện lấy mảng từ chính lại gọi range(x, y-1) và push số y-1 vào mảng vừa lấy. Điều kiện dừng khi số cuối cách số đầu 2 giá trị tức là (y – x == 2)

var range = function(start_num, end_num)   
{  
  if (end_num - start_num === 2)   
  {  
    return [start_num + 1];  
    // console.log(start_num+1, [start_num+1])
  }   
  else   
  {  
    var list = range(start_num, end_num - 1);  
    list.push(end_num - 1); 
    // console.log(end_num-1, list); 
    return list;  
  }  
};  
  
console.log(range(2,9)); 

Thứ tự thực hiện code trên như sau:

### Bắt đầu truyền vào 2 giới hạn gọi range(2, 9)
### list = range(2, 8); //lại gọi
    list.push(8);
### list = range(2, 7);
    list.push(7);
### list = range(2, 6);
    list.push(6);
### list = range(2, 5);
    list.push(5);
### list = range(2, 4);
    list.push(4);
### Kiểm tra điều kiện 4 - 2 == 2
    return trả về 3;

Nếu bạn bỏ comments console.log(); bạn sẽ thấy kết quả ra console của browser đảo ngược lại thứ tự trình bày như sau:

"Số thêm vào: 3"
"Mảng ban đầu: 3"
"Số thêm vào: 4"
"Kết quả mảng hiện tại: 3,4"
"Số thêm vào: 5"
"Kết quả mảng hiện tại: 3,4,5"
"Số thêm vào: 6"
"Kết quả mảng hiện tại: 3,4,5,6"
"Số thêm vào: 7"
"Kết quả mảng hiện tại: 3,4,5,6,7"
"Số thêm vào: 8"
"Kết quả mảng hiện tại: 3,4,5,6,7,8"

Lý do đảo lộn lại tại vì trong hàm range(x, y) lại gọi lại list = range(x, y-1), những số được push vào mảng lại phải gọi hàm lần nữa để lấy list, diễn tả nó cứ giống chuỗi dài dài như này ranger(x, y) -> ranger(x, y-1) -> …-> range(x, y-n). Vậy cái cuối range(x, y-n) thực hiện trước trả về mảng thì những cái trước nó mới được thực hiện có mảng mà push vào. Thế nên thứ tự nó đảo ngược như thế.

Rate this:

Share this:

Like this:

Like

Loading…