gpt4 book ai didi

haskell - 查找直角三角形时如何使用 Haskells 惰性

转载 作者:行者123 更新时间:2023-12-04 21:58:58 27 4
gpt4 key购买 nike

我正在学习 http://learnyouahaskell.com/starting-out 上的(优秀的)Haskell 教程。并且正在尝试直角三角形示例:

> let triangles = [(a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10], a^2 + b^2 == c^2]

运行这个我得到了,正如预期的那样:
> triangles 
[(4,3,5),(3,4,5),(8,6,10),(6,8,10)]

现在,我想尝试使用无限列表:
> let triangles = [(a,b,c) | c <- [1..], b <- [1..], a <- [1..], a^2 + b^2 == c^2] 

但是当我尝试它时,例如:
> take 2 triangles

...程序只是运行并没有输出。我究竟做错了什么?我认为 Haskells 的懒惰会导致它找到前两个三角形然后停止?

最佳答案

好吧,懒惰不是这里的问题。这是您在列表中迭代变量的顺序。

基本上发生的事情是:

  • c 绑定(bind)到 1
  • b 绑定(bind)到 1
  • a 绑定(bind)到 1
  • 检查方程
  • a 绑定(bind)到 2
  • 检查方程
  • a 绑定(bind)到 3
  • 检查方程

  • 它会永远持续下去。

    所以生成器不断迭代和绑定(bind) a 的值。 ,因为它不知道您需要停止并增加 bc改变。

    所以你需要以更平衡的方式生成元组。

    例如,您可以使用以下方法:
    triplesN :: Int -> [(Int, Int, Int)]
    triplesN n = [(i, j, n - i - j) | i <- [1..n - 2],
    j <- [1..n - i - 1], i>=j,
    let k = n - i - j, j>=k]

    isTriangle (a, b, c) = a^2 == b^2 + c^2

    triangles = filter isTriangle $ concatMap triplesN [1..]
    tripleN生成总和 n 的所有有序三元组.通过将此函数映射到所有自然数上,我们实际上得到了所有有序对的流。最后,我们只过滤那些三角形的三元组。

    通过做:
    take 10 triangles

    我们得到:
    [(5,4,3),(10,8,6),(13,12,5),(15,12,9),(17,15,8),(20,16,12),(25,24,7),(25,20,15),(26,24,10),(29,21,20)]

    关于haskell - 查找直角三角形时如何使用 Haskells 惰性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13396307/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com