Jos*_*osh 2 haskell predicate set combinatorics
我有一个关于Haskell的快速问题.我一直在跟踪学习你是一个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)]
这显然代表了相同的三角形,除了a和b值已被交换.
那么,有人可以引导我完成逻辑/执行/评估这里发生的事情吗?
原始版本考虑所有三元组(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
Run Code Online (Sandbox Code Playgroud)
原始版本执行此操作:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |