在Haskell中用最终迭代的条件和不同的迭代步骤最佳迭代
我想在Haskell中编写一个简单的迭代算法,但我正努力寻找优雅和速度方面的最佳解决方案。在Haskell中用最终迭代的条件和不同的迭代步骤最佳迭代
我有一个算法,需要应用一个操作到一个状态多次迭代,直到达到一些停止条件,记录状态使用一些任意函数。我已经知道如何通过定义像iterateM这样的函数来实现这样的方案。
但是在这种情况下,对每个步骤执行的操作取决于状态,并归结为检查'步骤类型'条件以决定下一个迭代类型,然后对接下来的10次迭代执行操作A,或者在再次检查条件之前对下一次迭代执行操作B.
我可以在一个命令行式风格写为:
c=0 while True:
if c>0:
x=iterateByA(x)
c=c-1
else:
if stepCondition(x)==0:
x=iterateByA(x)
c=9
else:
x=iterateByB(x)
observeState(x)
if stopCondition(x):
break
,当然这可能只是在Haskell被复制的,但我宁愿做一些更优雅。
我的想法是让迭代使用函数列表来弹出并应用到状态,并且一旦它为空就用新的列表(基于“步骤类型”条件)更新该列表。我略微担心,这将是无效的。会这样做,并使用类似
take 10 (repeat iterateByA)
编译掉所有的列表分配等,只有使用计数器,如上面的命令一个紧密循环?
是否还有另一种干净而有效的方法呢?
如果这对自适应随机模拟算法有帮助,则迭代步骤会更新状态,而步骤条件(决定最佳模拟方案)是当前状态的函数。实际上有3种不同的迭代方案,但我认为使用2的例子更容易解释。
(我不知道,如果它的问题,但我应该还指出,在Haskell的iterateByX功能是一元,因为他们使用的随机数。)
回答:
直接翻译看起来并不太坏。
loop c x | stopCondition x = observe x
| c > 0 = observe x >> iterateByA x >>= loop (c-1)
| stepCondition x = observe x >> iterateByA x >>= loop 9
| otherwise = observe x >> iterateByB x >>= loop c
重复observe
可以通过各种技巧删除,如果你不喜欢它。
不过你应该重新考虑一下。这是非常必要的方法;大概可以做得更好(但是很难从你在这里给出的几个细节中说出)。
以上是 在Haskell中用最终迭代的条件和不同的迭代步骤最佳迭代 的全部内容, 来源链接: utcz.com/qa/266434.html