gpt4 book ai didi

haskell - 计算递归次数

转载 作者:行者123 更新时间:2023-12-02 12:06:57 25 4
gpt4 key购买 nike

我有一些代码可以递归地近似解决方案,它实际上做什么并不重要,但它通过改变 mg 来实现 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)

我想要做的是计算周期数,我知道执行此操作的正确方法是使用 State monad,但是将 put/get 放入类似函数的最优雅的方法是什么这?制作一个 do block ?或者只是添加一个计数器solve_m'并返回(counter, mg)?

谢谢!

编辑:这似乎基本上就是我想要的,不需要 Monad:

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 迭代中得到了可接受的结果!

最佳答案

在不查看算法的情况下,执行此操作的通用方法是将终止条件与迭代算法分开:

terminationPred :: a -> Bool
algorithm :: a -> a

然后使用 iterate 和 takeWhile:

itermediates = takeWhile (not . terminationPred) . iterate algorithm
resultAndRecursions :: a -> (a, Int)
resultAndRecursions a = (last (intermediates a), length (intermediates a) - 1)
-- you'd want to make your own safe function here, not use last and length

或展开:

intermediates = unfoldr op
where
op a | terminationPred a = Nothing
| otherwise = let a' = algorithm a
in Just (a', a')

编辑:还请注意,这两个中间体略有不同,因为第一个中间体维护基本情况(输入 a,因此 - 1),而第二个则不维护基本情况因此,互补的 resultAndRecursions 会有细微差别。

关于haskell - 计算递归次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3926681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com