我正在使用以下控制结构(我认为它是尾递归的)
untilSuccessOrBigError :: (Eq e) => (Integer -> (Either e a)) -> Integer -> e -> (Either e a)
untilSuccessOrBigError f count bigError
= case f count of
Right x -> Right x
Left e -> (if e==bigError then Left e else untilSuccessOrBigError f (count - 1) e)
做迭代深化
iterativeDeepening :: (a -> [a]) -> (a -> Bool) -> (a -> Bool) -> a -> Either String a
iterativeDeepening stepFunc isAValidSolution isGraphBottom x
= untilSuccessOrBigError
(\count -> dfsWithMaxDepth stepFunc isAValidSolution isGraphBottom count x)
(-1)
"Reached graph bottom"
在每次迭代深化之后,这个空闲内存(因为它在技术上将不再能够到达它),如果不是,我应该如何重写控制结构?
PS在第二个虽然看起来这会失败,因为尾递归结构经常能够访问堆栈上的东西,比如添加到前一个值,即使在这种情况下它没有。– Roman A. Taycher 11 月 28 日 12:33 PPS 在第三个问题上,尽管它让我认为它可以在 dfsWithMaxDepth 返回后立即丢弃 dfsWithMaxDepth 中的值,并且一堆答案不会占用太多内存。– Roman A. Taycher 11 月 2 日