Давайте рассмотрим пример, то:
repBinario 5
определение Заменитель repBinario 5
:
10 * repBinario (5 `div` 2) + 5 `mod` 2
Уменьшить div
и mod
:
10 * repBinario 2 + 1
^
Здесь мы выпустили нашу первую цифру, обозначенную ^
.
Заменитель определение repBinario 2
:
10 * (10 * repBinario (2 `div` 2) + 2 `mod` 2) + 1
^
Уменьшить div
и mod
:
10 * (10 * repBinario 1 + 0) + 1
^^
Заменитель определение repBinario 1
:
10 * (10 * (10 * repBinario (1 `div` 2) + 1 `mod` 2) + 0) + 1
^^
Уменьшить div
и mod
:
10 * (10 * (10 * repBinario 0 + 1) + 0) + 1
^^^
Заменитель определение repBinario 0
:
10 * (10 * (10 * 0 + 1) + 0) + 1
^^^
Сокращение:
101
На каждом шаге (`mod` 2)
получает значащий двоичный разряд, и (`div` 2)
сдвигает число вправо , отбрасывая цифру и передавая остальную часть числа рекурсивно t o divBinario
. В конце мы делаем противоположный процесс: (+ d)
добавляет текущую цифру в результат, а (* 10)
сдвигает число влево, поэтому мы можем добавить больше цифр.
Что вы получаете, это десятичное число, которое выглядит, идентичное двоичному представлению исходного ввода.
Если удалить умножение на 10
, вы получаете popCount
, функцию, которая дает Вам количество населения из ряда-число 1
битов в его двоичном представлении:
popCount 0 = 0
popCount x = popCount (x `div` 2) + x `mod` 2
popCount 5 == 2
Непонятный вопрос. – melpomene
@melpomene Я хотел знать, что происходит каждый раз, когда вызывается 'repBinario', эта рекурсия была немного запутанной для новичка, подобного мне. Ответы ниже, мы действительно полезны. – Tepes
Ответы, на которые мы очень помогаем, я не выбрал только один, потому что некоторые люди, возможно, не искали то же самое, что и я, во всяком случае, я решил увеличить каждый ответ, поскольку все они структурировали проблему по-другому и поэтому вопрос привел к разнообразию решений, все одинаково интересные. Спасибо. – Tepes