Suppose the h(n) function is defined on the set of integer numbers as below. For the call h(3), how many calls to h will be made, including the original call?

4 phương ánCó giải thích
Đề bài
int h(int n)
  {if (n == 0 || n==1)
      return(1);
       else
        return(h(n-1)+h(n-2));
  }

Các phương án trả lời

Chọn một phương án
Lời giảiChọn phương án để mở
Đáp án đúng: "5". Hàm dừng khi n bằng 0 hoặc 1, còn lại tự gọi hai lần với n-1 và n-2, nên phải đếm từng lời gọi chứ không phải từng giá trị khác nhau của n. Mở cây lời gọi cho h(3): h(3) gọi h(2) và h(1); h(2) lại gọi h(1) và h(0); h(1) và h(0) là trường hợp cơ sở nên không gọi thêm. Liệt kê ra có h(3), h(2), h(1) sinh từ h(3), h(1) sinh từ h(2) và h(0), cộng cả lời gọi gốc là 5. Vì vậy "2" sai vì nó chỉ đếm hai lời gọi con trực tiếp của h(3); "3" sai vì nó đếm theo đối số khác nhau là 3, 2, 1 và bỏ qua việc h(1) bị gọi tới hai lần ở hai nhánh khác nhau cùng với h(0); "4" sai vì nó bỏ đúng một trong hai lần gọi h(1), và đây chính là chỗ làm đệ quy kiểu Fibonacci tốn kém: cùng một đối số bị tính lại nhiều lần.

Cùng phần 3

Xuất hiện trong 1 bộ đề