Как правильно использовать функцию, которая является рекурсивной и получает единственный аргумент? - PullRequest
0 голосов
/ 05 июня 2018

При попытке выполнить следующее упражнение ...

Определите функцию binaryDigits, которая получает целое число и возвращает количество цифр, необходимое для записи такого числа в двоичном коде.

... Я подумал, что невозможно решить эту проблему путем рекурсивного вызова функции binaryDigits, потому что единственная переменная, которую она получает, - это действительное число

Я говорю это, потому чтовеб-сайт утверждает, что хотя выполняемые им тесты были успешными, я не использовал рекурсию в функции binaryDigits.

, так как я мог даже подумать о рекурсивном вызове этой функции, если я даже не могу сказать, какя много раз звонил (и давайте скажем, что количество вызываемых звонков представляет, сколько двоичных цифр требуется для представления этого числа).

Это то, что я подумал: обратите внимание, что I 'm с использованием рекурсии, но во вспомогательной функции, которая возвращает список десятичных значений, которые двоичные цифры представляют , когда сумма этого списка равна gповторить полученный номер:

double = (2*)

listOfBinaryDigits list num | num > (sum list) = listOfBinaryDigits ([double(head list)]++list) num
                            | otherwise = list

binaryDigits num = length (listOfBinaryDigits [1] num)

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Нет необходимости в рекурсии или итерации.Возможно, вы можете сделать с основанием 2 логарифм следующим образом:

binaryDigits :: (Floating a, Integral c, RealFrac a) => a -> c
binaryDigits n | n == 0    = 1
               | otherwise = 1 + (floor . logBase 2 $ n)
> binaryDigits 1453
> 11
0 голосов
/ 05 июня 2018

Вот «итеративное» решение:

binaryDigits = length . takeWhile (not . (==0)) . iterate (`div` 2)

Вы также можете переопределить его, повторяя до тех пор, пока не достигнете дна и не сложите длину на обратном пути.Это будет хорошее упражнение, поэтому я сохранил решение в спойлере для вас

...