Tờ giấy màu của bạn Nam có hình dạng chữ nhật kích thước a*b(a>b). Sau đó Nam gấp chéo tờ giấy tạo thành đường gấp có góc 45 độ, một mép có một cạnh trùng với tờ giấy(như hình vẽ) sau đó cắt phần giấy thừa không bị đè lên.
Sau khi cắt, Nam nhận được mảnh giấy hình vuông b*b và một mảnh có kích thước b*(a*b). nam lại tiếp tục thực hiện thao tác như trên với b*(a-b) và cứ như thế cho đến khi tất cả các mảnh giấy đều là hình vuông.
Hãy xác định xem Nam có bao nhiêu mảnh giấy hình vuông?
Bồi dưỡng học sinh giỏi Tin lớp 8 Pascal
Quảng cáo
1 câu trả lời 434
Để giải bài toán này, ta có thể sử dụng phương pháp đệ quy. Gọi f(a,b) là số lượng mảnh giấy hình vuông thu được từ tờ giấy ban đầu có kích thước a*b. Khi gấp chéo tờ giấy ban đầu, ta sẽ thu được hai tờ giấy mới có kích thước a/√2 * b và b/√2 * (a-b). Do đó, ta có công thức đệ quy:
f(a,b) = 1 + f(b, a-b/√2) nếu a > b
f(a,b) = 1 nếu a = b
Giải thích: Nếu a = b, tờ giấy ban đầu đã là hình vuông, không cần cắt thêm. Ngược lại, ta sẽ cắt tờ giấy ban đầu thành một mảnh hình vuông và một mảnh hình chữ nhật có kích thước b*(a-b). Sau đó, ta tiếp tục cắt mảnh hình chữ nhật này theo cùng cách cho đến khi thu được các mảnh giấy hình vuông.
Áp dụng công thức đệ quy trên, ta có thể viết chương trình tính số lượng mảnh giấy hình vuông từ tờ giấy ban đầu có kích thước a*b như sau:
```
int countSquares(int a, int b) {
if (a == b) {
return 1;
} else {
return 1 + countSquares(b, (int)(a - b / sqrt(2)));
}
}
```
Lưu ý: Trong công thức đệ quy, ta phải ép kiểu kết quả của biểu thức a - b/√2 về kiểu int để tránh sai số khi tính toán.
Quảng cáo
Bạn cần hỏi gì?
Câu hỏi hot cùng chủ đề
-
Hỏi từ APP VIETJACK
Đã trả lời bởi chuyên gia
45024 -
Hỏi từ APP VIETJACK
Đã trả lời bởi chuyên gia
34480 -
Đã trả lời bởi chuyên gia
30258 -
Hỏi từ APP VIETJACK27227
-
Hỏi từ APP VIETJACK
Đã trả lời bởi chuyên gia
21902
