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));
  }

Which call will result in the most recursive calls?

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: "fun(-1012);". Với đối số âm, hàm gọi thêm một lượt fun(-n) rồi mới bước vào chuỗi chia đôi, nên nó tốn đúng một lời gọi nhiều hơn số dương tương ứng. Chuỗi của 1012 là 1012, 506, 253, 126, 63, 31, 15, 7 rồi 3 và dừng vì 3 nhỏ hơn 5, tức 8 lời gọi đệ quy; fun(-1012) thêm bước đổi dấu nên có 9. Phương án "fun(1012);" chính là chuỗi 8 lời gọi vừa đếm, ít hơn đúng một bước. Phương án "fun(1014);" cũng chỉ được 8 vì 1014 chia đôi thành 507 rồi 253, nhập vào đúng chuỗi của 1012 từ số 253 trở đi. Phương án "fun(100);" chỉ có 5 lời gọi theo chuỗi 100, 50, 25, 12, 6, 3. Phương án "fun(0);" không gọi đệ quy lần nào vì 0 nhỏ hơn 5 nên hàm trả về 2 ngay.

Cùng phần 3

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