gpt4 book ai didi

haskell - 了解一点 Haskell

转载 作者:行者123 更新时间:2023-12-02 06:39:26 25 4
gpt4 key购买 nike

我有一个关于 Haskell 的快速问题。我一直在关注Learn You a Haskell ,并且对于以下片段的执行顺序/逻辑有点困惑,用于计算三角形的边长,当所有边都等于或小于 10 且三角形的总周长为 24 时:

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

令我困惑的部分是 b 的扩展上限和 a捆绑。据我所知,..c..b用于删除同一组三角形边的其他排列(组合?)。

当我用 ..c/b 运行它时,我得到答案:

[(6,8,10)]

当我没有 ..c/b :

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

因为我最初输入时没有,所以我得到了:

[(8,6,10),(6,8,10)]

这显然代表同一个三角形,除了 ab值已被交换。

那么,有人可以向我介绍这里发生的事情的逻辑/执行/评估吗?

最佳答案

原始版本考虑了所有三元组 (a,b,c),其中 c 是 1 到 10 之间的数字,b 是 1 到 c 之间的数字,a 是 1 到 b 之间的数字。 (6,8,10) 符合该标准,(8,6,10) 不符合(因为这里 a 是 8,b 是 6,所以 a 不在 0 和 6 之间)。

在您的版本中,您考虑了所有三元组 (a,b,c),其中 a、b 和 c 介于 1 和 10 之间。您对 a、b 和 c 之间的关系没有任何限制,因此 (8, 6 , 10) 不被排除在外,因为其中的所有数字确实都在 1 到 10 之间。

如果您从命令式 for 循环的角度考虑它,您的版本会这样做:

for c from 1 to 10:
for b from 1 to 10:
for a from 1 to 10:
if a^2 + b^2 == c^2 and a+b+c==24:
add (a,b,c) to the result

虽然原始版本是这样做的:

for c from 1 to 10:
for b from 1 to c:
for c from 1 to b:
if a^2 + b^2 == c^2 and a+b+c==24:
add (a,b,c) to the result

关于haskell - 了解一点 Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10950356/

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