Giải thích giúp hàm đệ quy

Chào mọi người. Em mới học về cái đệ quy gần đây và chưa hiểu lắm ở đoạn này?
Có ai có thể giải thích cho em vì sao nó lại thành [1,2,3,4,5] mà không phải là [5,4,3,2,1] không?
Tại vì em thấy nó push vào theo n-1 mà nhỉ?

function countup(n) {
  if (n < 1) {
    return [];
  } else {
    const countArray = countup(n - 1);
    countArray.push(n);
    return countArray;
  }
}
console.log(countup(5));
countup(5)
=> countup(4) push(5)
=> countup(3) push(4) push(5)
=> ...
=> countup(0) push(1) push(2) ... push(5)
=> [] push(1) push(2) ... push(5)
=> [1, 2, 3, 4, 5]
4 Likes

Em hơi gà anh chỉ rõ hơn cái đoạn mà

Được không ạ? :disappointed:

Viết tắt đó bạn :smiley: thêm dấu chấm nữa.

2 Likes

Bạn làm giống như phương pháp chứng minh quy nạp ấy.
Cho đoạn code như trên. Chứng minh output của countup(n) = [1,2,…,n]

Bước cơ sở: (n = 0)
n = 0 < 1 nên countup(0) = [], thoả mãn.

Bước quy nạp:
Giả sử với countup(k) = [1,2,…,k] đúng với số nguyên k không âm. Chứng minh countup(k+1) = [1,2,…,k+1].
Vì k >= 0 nên k+1 >= 1, suy ra đoạn else được chạy.

  • countArray = countup((k+1) - 1) = countup(k) = [1,2,…,k] (giả thuyết).
  • countArray.push(k+1) thì countArray = [1,2,…,k,k+1]
  • return countArray: countup(k+1) = [1,2,…,k+1]

=> Vậy bước quy nạp đúng

Vì cơ sở và quy nạp, chứng tỏ countup(n) = [1,2,…,n].
Với n = 5 thì countup(5) = [1,2,3,4,5].

5 Likes

Mình nhận thấy khi n chạy từ 5 đến 0 rồi thì kết quả mới bắt đầu xuất ra màn hình theo chiều ngược lại => kết quả của các n > 0 sẽ bị treo cho tới khi thoát khỏi đệ quy mới xuất ra đc.

4 Likes

Đệ quy đàu có tính chất tương tự stack, và hoạt động dựa trên vùng nhớ stack của chương trình.
Cái gì gọi sau thì thực thi trước.

7 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?