【发布时间】:2021-01-05 18:57:20
【问题描述】:
我是 Haskell/FP 的新手。我想解决这个任务:
给出这个列表:[1721, 979, 366, 299, 675, 1456]
找出总和为2020 的两个元素并将它们相乘。解是 1721 * 299。
我认为在 Haskell 中,我可以用来解决这个问题的工具是列表理解和折叠(或它们的组合)。但我不明白如何编写一个列表理解,它考虑到同一列表的其他元素,而不仅仅是当时的一个元素。
这是我几个小时后想出的(ints 是列表):
print [(x,y, x*y) | x <- ints, y <- ints, x+y == 2020]
它实际上打印了正确的答案。但我认为我的解决方案很脏:
- 我将输入列表两次输入到列表理解中。这个对吗?对我来说,这似乎是开销/重复。我相信有更好的方法。
- 函数的返回是一个包含两个相同实体的列表(我假设这是因为我在上一个项目符号中描述的内容):
[(1721,608,514579),(1721,608,514579)]- 当然我可以使用head获得单个元素,但是没有解决问题的根源。
【问题讨论】:
-
您将枚举每两个组合,因此这将使用 二次时间。通过先对列表进行排序,可以得到线性时间。
-
你会得到每个答案两次,因为
x和y可以互换,x + y == y+x。