Hãy cùng xem qua một ví dụ, sau đó:
repBinario 5
định nghĩa thay thế của repBinario 5
:
10 * repBinario (5 `div` 2) + 5 `mod` 2
Giảm div
và mod
:
10 * repBinario 2 + 1
^
Ở đây chúng tôi đã tạo ra chữ số đầu tiên của chúng tôi, được đánh dấu bằng ^
.
định nghĩa thay thế của repBinario 2
:
10 * (10 * repBinario (2 `div` 2) + 2 `mod` 2) + 1
^
Giảm div
và mod
:
10 * (10 * repBinario 1 + 0) + 1
^^
định nghĩa thay thế của repBinario 1
:
10 * (10 * (10 * repBinario (1 `div` 2) + 1 `mod` 2) + 0) + 1
^^
Giảm div
và mod
:
10 * (10 * (10 * repBinario 0 + 1) + 0) + 1
^^^
định nghĩa thay thế của repBinario 0
:
10 * (10 * (10 * 0 + 1) + 0) + 1
^^^
Giảm:
101
Tại mỗi bước, (`mod` 2)
được các chữ số nhị phân có ý nghĩa nhất, và (`div` 2)
chuyển số rightward , loại bỏ chữ số và chuyển số còn lại của số đó một cách đệ quy o divBinario
. Cuối cùng, chúng tôi thực hiện quy trình ngược lại: (+ d)
thêm chữ số hiện tại vào kết quả và (* 10)
thay đổi số sang trái để chúng tôi có thể thêm nhiều chữ số hơn.
Những gì bạn nhận được là một số thập phân mà trông giống hệt với biểu diễn nhị phân của đầu vào gốc.
Nếu bạn loại bỏ các nhân bởi 10
, bạn sẽ có được popCount
, một chức năng cung cấp cho bạn các tính dân một số-số lượng 1
bit trong biểu diễn nhị phân của nó:
popCount 0 = 0
popCount x = popCount (x `div` 2) + x `mod` 2
popCount 5 == 2
Tôi không hiểu câu hỏi. – melpomene
@melpomene Tôi muốn biết điều gì sẽ xảy ra mỗi khi 'repBinario' được gọi, sự đệ quy này hơi gây nhầm lẫn cho một người mới như tôi. Các câu trả lời dưới đây chúng tôi thực sự hữu ích mặc dù. – Tepes
Các câu trả lời chúng tôi rất hữu ích, tôi không chọn chỉ vì một số người có thể không tìm kiếm cùng một thứ mà tôi đã làm, dù sao, tôi quyết định upvote mỗi câu trả lời vì tất cả chúng đều cấu trúc vấn đề theo một cách khác và vì vậy câu hỏi dẫn đến các giải pháp đa dạng, tất cả đều thú vị. Cảm ơn bạn. – Tepes