Подсчет времени рекурсии в Хаскеле

Это может произойти по одной из трех причин: -

1) Отсутствует установка VC ++: Установите все версии пакетов перераспределения VC ++ VC9, VC10, VC11, VC13, VC14 и VC15. См. Ссылку, указанную в конце для ссылки для загрузки. Если у вас 64-разрядная Windows, вы должны установить как 32, так и 64-битные версии каждого пакета VisualC ++, даже если вы не используете бит Wampserver 64.

2) Вы забыли предоставить права администратора на WAMP Server : Запуск и установка с параметром «Запуск от имени администратора» очень важны.

3) WAMP, IIS и Skype сражаются за один и тот же порт:

-2
задан Will Ness 16 January 2019 в 20:49
поделиться

1 ответ

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

Например, скажем, я хотел вычислить факториал, но я хотел отследить, сколько шагов потребовалось. Моя сигнатура функции может выглядеть так:

factorial :: Int -> (Int, Int) -- Takes a number, returns the number and recursion count
factorialInternal :: (Int, Int) -> (Int, Int) -- This actually does the recursion

, а затем определения могут выглядеть так:

factorial n = factorialInternal (n, 0)
factorialInternal (1, n) = (1, n + 1)
factorialInternal (x, n) = let (y, z) = factorialInternal (x-1, n) in (x * y, z + 1)

По сути, параметр, отслеживающий количество рекурсии, увеличивается на каждом уровне, и затем становится частью вывода factorial.

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

-- The function you call
calculateDifference :: (Int, Int, Int) -> (Int, Int, Int) -> Int
-- What the calculateDifference function calls (the third parameter is the recursion counter)
calculateDifferenceInternal :: (Int, Int, Int) -> (Int, Int, Int) -> Int -> Int

Отсюда вы сможете понять, как реализовать calculateDifference и calculateDifferenceInternal.


РЕДАКТИРОВАТЬ: Как указывал Амаллой, лучшее решение состоит в том, чтобы просто вывести счетчик, а не принимать один: поэтому вместо factorialInternal :: (Int, Int) -> (Int, Int), factorialInternal Int -> (Int, Int) будет работать. Тогда определение будет выглядеть так:

factorialInternal 1 = (1, 0)
factorialInternal n = let (x, y) = factorialInternal (n - 1) in (n * x, y + 1)
0
ответ дан ThatOneDeveloper 16 January 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: