当满足条件时如何退出迭代循环?

3

我想使用iterate函数迭代一个名为g的函数。但是当我运行代码时,循环会无限运行。是否有可能在满足条件时退出循环?

例如:if g x > 100 then stop

我的代码:

f x = iterate g x

g x = 2 * x

1
你也可以尝试使用until函数。http://zvon.org/comp/r/ref-Haskell.html#Functions~Prelude.until - keep_learning
take 100 $ f 1 - fp_mora
2个回答

4

只需反转条件,并使用takeWhile,只要条件成立就执行:

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

这也可以变成无参函数的形式:

f = takeWhile (<= 100) . iterate g

当累加器小于或等于100时,这将从iterate返回的无限列表中获取。


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 . (> 100)) . iterate (*2)takeUntil (> 100) . iterate (*2)。其中(not . (> 100))当然和(<= 100)是一样的。

最近我看到许多用户切换到空白头像,这是什么意思?在元社区上找不到任何相关信息... - Redu
@Redu 这里没有人有空白头像。我认为你可能遇到了连接问题或其他问题。 - Carcigenicate
@Carcigenicate 是的,我猜“或者其他什么”是适用于这里的。奇怪的是,我在所有不同位置的计算机上都看到了“某些特定”的用户。虽然问题完全脱离主题,但很抱歉。 - Redu
@Redu 请尝试访问https://stackoverflow.com/users/849891/will-ness?tab=profile。顺便说一下,我也曾偶尔遇到过相同的问题。我只是忽略它,然后它就恢复正常了。 - Will Ness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接