我写了这个辅助函数:
(defn iterate-converge
"Returns the value from calling (f x) some number of times, until
`x` changes by less than a tolerance, `tol`. Will not execute more
than `b` (e.g. bailout) times."
[f x0 tol b]
(loop [f f x x0 tol tol b b i 0]
(if (>= i b)
(throw (ex-info "Failed to converge"
{:type ::failed-to-converge :tol tol :b b}))
(let [x' (f x)]
(if (< (abs (- x x')) tol)
x'
(recur f x' tol b (inc i)))))))
根据参数,这可能需要很长时间。我想要关于其进展的功能报告。我不希望它与控制台输出相关联(例如println
)。
我目前的想法:
你会做什么以及为什么?
答案 0 :(得分:3)
让它返回一个懒惰的候选答案序列。然后你可以在闲暇时迭代它们,只要答案可以接受就停止,或者你决定它花了太长时间而你想放弃。
答案 1 :(得分:2)
我个人会按相反顺序对这些选项进行排名,#3最灵活,因为这样你就可以用更有趣(和有趣)的方式处理输出。
如果您正在寻找更多选项,我可以推荐Narrator library作为准确生成长期运行流程的定期报告的方法。