Consider the following function:

5 phương ánCó giải thích
Đề bài
int fun(int n)
  {if (n < 0)
     return(fun(-n));
      else if(n<5)
       return(2);
        else
        return(n*fun(n/2));
  }

What is the value of fun(-3)?

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: "2". Lời gọi fun(-3) rơi vào nhánh n < 0 nên hàm tự gọi lại với -(-3) = 3; ở lời gọi thứ hai n = 3 thoả điều kiện n < 5 nên hàm trả về ngay hằng 2 và dãy đệ quy dừng, không bao giờ chạm tới nhánh lấy n nhân với fun(n/2). Giá trị 2 ra tới ngoài nguyên vẹn vì nhánh n < 0 chỉ viết return(fun(-n)) chứ không nhân hay cộng thêm gì. Phương án "12" ứng với việc tưởng nhánh cuối được dùng, kiểu lấy 3 nhân fun(1) rồi còn nhân tiếp, nhưng với n = 3 thì điều kiện n < 5 đã chặn trước khi tới đó. Phương án "4" ứng với việc cộng dồn hai lần giá trị dừng 2, trong khi mỗi lời gọi chỉ trả về một lần. Phương án "5" là chính ngưỡng dừng n < 5 bị chép lại thành kết quả, còn hàm thì trả về hằng 2 chứ không trả về ngưỡng. Phương án "10" là 5 nhân 2, tức lấy ngưỡng nhân với giá trị cơ sở, một phép tính không có trong mã. Bẫy của câu này nằm ở dấu âm: hàm đổi dấu trước rồi mới so sánh, nên fun(-3) và fun(3) cho cùng một kết quả.

Cùng phần 3

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