Chào các bạn, hôm nay cafedev chia sẻ cho ace một danh sách các bài tập từ cơ bản tới nâng cao liên quan tới các kiến thức cơ bản trong lập trình Javascript. Cụ thể, trong bài này chúng ta sẽ làm quen với Đệ quy, ngăn xếp,hàm mũi tên. Từ đó giúp ace nâng cao kiến thức, kỹ năng, kinh nghiệm lập trình của mình và áp dụng nó vào thực tế.

Trước khi đi vào chi tiết bài tập, cafedev khuyến khích ace tự code bài tập của mình trước khi tham khảo bài hướng dẫn nhé.

Để chạy hoặc code các bài tập sau, ace có thể code trên trang web này như sau:

  • Chọn new
  • Chọn dự án bạn muốn code, ở đây có nhiều lựa chọn như Javascript, AngularJS, React,…. Tất nhiên mình sẽ chọn Javascript.
  • Sau đó bạn sẽ thấy nơi bạn code.
  • Sau khi code sau chọn Preview để xem kết quả.

Ngoài ra ace cũng có thể dùng các IDE đã được giới thiệu tại đây để code và chạy code đó trên máy tính của mình nhé.

Bài 1

Viết hàm sumTo(n) tính tổng các số 1 + 2 + ... + n. Dùng đệ quy…

Ví dụ:

sumTo(1) = 1
sumTo(2) = 2 + 1 = 3
sumTo(3) = 3 + 2 + 1 = 6
sumTo(4) = 4 + 3 + 2 + 1 = 10
...
sumTo(100) = 100 + 99 + ... + 2 + 1 = 5050

Bài 2

Giai thừa của một số tự nhiên là một số nhân với “số trừ một”, sau đó với “số trừ hai”, và cứ tiếp tục như vậy cho đến 1. Giai thừa của n được ký hiệu là n!

Chúng ta có thể viết một định nghĩa về giai thừa như sau:

n! = n * (n - 1) * (n - 2) * ...*1

Giá trị của các giai thừa cho n khác nhau:

1! = 1
2! = 2 * 1 = 2
3! = 3 * 2 * 1 = 6
4! = 4 * 3 * 2 * 1 = 24
5! = 5 * 4 * 3 * 2 * 1 = 120

Nhiệm vụ là viết một hàm factorial(n) để tính n! sử dụng các cuộc gọi đệ quy.

alert( factorial(5) ); // 120

Bài 3

Dãy số Fibonacci có công thức Fn = Fn-1 + Fn-2. Nói cách khác, số tiếp theo là tổng của hai số đứng trước.

Hai số đầu tiên là 1, sau đó là 2 (1 + 1), sau đó là 3 (1 + 2), 5 (2 + 3), v.v.: 1, 1, 2, 3, 5, 8, 13, 21 … .

Số Fibonacci có liên quan đến Tỷ lệ vàng và nhiều hiện tượng tự nhiên xung quanh chúng ta.

Viết hàm fib (n) trả về số Fibonacci thứ n.

Một ví dụ về công việc:

function fib(n) { /* your code */ }

alert(fib(3)); // 2
alert(fib(7)); // 13
alert(fib(77)); // 5527939700884757

Bài 4

Giả sử chúng ta có một danh sách liên kết đơn (như được mô tả trong bài Đệ quy và ngăn xếp):

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null
      }
    }
  }
};

Viết một hàm printList(list) xuất ra từng item một trong danh sách.

Tạo hai biến thể: sử dụng vòng lặp và sử dụng đệ quy.

Điều gì tốt hơn: có đệ quy hay không có đệ quy?

Bài 5

Xuất danh sách liên kết đơn từ bài 4 trước Xuất ra danh sách liên kết đơn theo thứ tự ngược lại.

Đưa ra hai giải pháp: sử dụng vòng lặp và sử dụng đệ quy.

Hướng dẫn cách xem và tải tài liệu từ trang cafedev tại đây.


Giải bài 1,2,3,4,5

Bài 6

Đầu ra sẽ là gì?

function f() {
  alert( this ); // ?
}

let user = {
  g: f.bind(null)
};

user.g();

Bài 7

Chúng ta có thể thay đổithis bằng cách binding không?

Đầu ra sẽ là gì?

function f() {
  alert(this.name);
}

f = f.bind( {name: "John"} ).bind( {name: "Ann" } );

f();

Bài 8

Có một giá trị trong thuộc tính của một hàm. Nó sẽ thay đổi sau khi bind? Tại sao, hoặc tại sao không?

function sayHi() {
  alert( this.name );
}
sayHi.test = 5;

let bound = sayHi.bind({
  name: "John"
});

alert( bound.test ); // what will be the output? why?

Bài 9

Lệnh gọi đến askPassword() trong đoạn mã dưới đây nên kiểm tra mật khẩu và sau đó gọi user.loginOk/loginFail tùy thuộc vào câu trả lời.

Nhưng nó dẫn đến một lỗi. Tại sao?

Sửa dòng được đánh dấu để mọi thứ bắt đầu hoạt động bình thường (các dòng khác không được thay đổi).

function askPassword(ok, fail) {
  let password = prompt("Password?", '');
  if (password == "rockstar") ok();
  else fail();
}

let user = {
  name: 'John',

  loginOk() {
    alert(`${this.name} logged in`);
  },

  loginFail() {
    alert(`${this.name} failed to log in`);
  },

};

askPassword(user.loginOk, user.loginFail);

Giải bài 6,7,8,9

Lưu ý: Mọi bài tập bên dưới cũng như các bài tập khác trong Series Javascript này được tạo ra từ các bài học và kiến thức của từng phần trong series tự học Javascript này. Nếu ace nào chưa làm được hoặc chưa hiểu kỹ về bài học thì bạn có thể tham khảo lại series tự học này nhé. Chúc các bạn thành công.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!