У меня есть код, который аппроксимирует решение взамен, то, что он на самом деле делает, не имеет значения, но он работает в направлении r '== rt, изменяя мг (предположим, начиная с 4.0, потому что я «знаю», которые должны быть в шаге).Подсчет числа рекурсий
solve_m f ar st qt = solve_m' f ar st qt 4.0
where
solve_m' f ar st qt mg
| rd > precis = f' (mg - sf)
| rd < (-precis) = f' (mg + sf)
| otherwise = mg
where
f' = solve_m' f ar st qt
rt = st + qt
r' = f st ar mg
rd = rt - r'
sf = abs(rd)
То, что я хотел бы быть в состоянии сделать это подсчитать количество циклов, я знаю, что правильный способ сделать это с государством монады, но то, что это самый элегантный способ, чтобы соответствовать пут/получить в такую функцию? Сделать f 'блок блокировки? Или просто добавить счетчик solve_m 'и return (counter, mg)?
Спасибо!
Edit: Это, кажется, в основном то, что я хочу, и не Монады необходимые:
solve_m f ar st qt = (last (series), length(series))
where
series = takeWhile termPred (iterate solve_m' 4.0)
termPred m' = (abs (rt - (f st ar m'))) > precis
rt = st + qt
solve_m' mg
| rt > r' = (mg - sf)
| rt < r' = (mg + sf)
where
r' = f st ar mg
rd = rt - r'
sf = abs(rd)
Тем не менее выглядит немного грязный (повторяющийся код), но я буду убирать это ... Это становится мне приемлемые результаты в 1/10000-й итерации кода, который он заменит!
Если вы просто хотите увидеть, сколько рекурсии существует для какого-либо тестового ввода, вы можете профилировать его (сообщает вам, как часто вызывается функция). См. Http://www.haskell.org/ghc/docs/6.12.2/html/users_guide/profiling.html – delnan
«Я знаю, что правильный способ сделать это с государственной монадой» Откуда вы это знаете? 'State' - это просто синтаксический сахар для передачи/возврата дополнительной ценности. Как и любой сахар, будут случаи, когда непритязательная форма будет приятнее. – keegan
@keegan - good point :-) – Gaius