【问题标题】:How to get out of iterate loop when a condition is met?满足条件时如何退出迭代循环?
【发布时间】:2021-01-18 16:26:11
【问题描述】:

我想用iterate 迭代函数g。当我运行我的代码时,循环会无限运行。满足条件时有没有可能跳出循环?

类似if g x > 100 then stop

我的代码:

f x = iterate g x

g x = 2 * x

【问题讨论】:

标签: loops haskell


【解决方案1】:

只需翻转条件,takeWhile 就成立了:

f x = takeWhile (<= 100) $ iterate g x

这也可以是无意义的:

f = takeWhile (<= 100) . iterate g

这将取自 iterate 在累加器小于或等于 100 时返回的无限列表。

【讨论】:

    【解决方案2】:

    是的,你可以使用takeWhile (not . p),相当于

    foldr (\x r -> if (not (p x)) then (x:r) else []) []
    

    或者有时以下是有用的,

    takeUntil p = foldr (\x r -> if (not (p x)) then (x:r) else [x]) []
    

    如果您想将最后一个元素也包含在序列中。

    在你的情况下,你会写takeWhile (not . (&gt; 100)) . iterate (*2),或takeUntil (&gt; 100) . iterate (*2)

    (not . (&gt; 100))当然和(&lt;= 100)是一样的。

    【讨论】:

    • 我看到许多用户最近切换到的空白头像有什么意义..?在 meta 上找不到任何内容...
    • @Redu 这里没有人有空白头像。我认为您遇到了连接问题或其他问题。
    • @Carcigenicate 是的,我猜“或某事”在这里申请。奇怪的是,我在位于不同位置的所有计算机中的“某些特定”用户中看到了这一点。抱歉,问题完全不在主题范围内。
    • @Redu 试试stackoverflow.com/users/849891/will-ness?tab=profile。顺便说一句,我以前有时——很少——有同样的问题。我只是忽略了它,它恢复了正常。
    猜你喜欢
    • 2023-01-12
    • 2014-10-05
    • 2021-08-22
    • 2021-03-10
    • 2022-01-25
    • 1970-01-01
    • 2022-01-13
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多