我正在研究 Project Euler Problem 4,需要找到 2 个 3 位数字乘积的回文,所以我想出了:
palindrome = [ x*y | x <- [100..999], y <- [100..999], reverse [x*y] == [x*y]]
为什么这不起作用,我怎样才能使它起作用?我怀疑我需要以某种方式将答案放入列表中,以便将其反转并检查它是否是回文。
我正在研究 Project Euler Problem 4,需要找到 2 个 3 位数字乘积的回文,所以我想出了:
palindrome = [ x*y | x <- [100..999], y <- [100..999], reverse [x*y] == [x*y]]
为什么这不起作用,我怎样才能使它起作用?我怀疑我需要以某种方式将答案放入列表中,以便将其反转并检查它是否是回文。
这部分
reverse [x*y] == [x*y]
是错的。[x*y]
是一个具有单个元素的列表: 的结果x*y
。反面是同一个列表...
你想要的是数字颠倒的数字。您需要一个包含号码数字的列表。一个简单的技巧就是将数字转换为它的字符串表示(记住type String = [Char]
)。为此,您可以使用show
, 而不是[ ]
:
palindrome = [ x*y | x <- [100..999], y <- [100..999], reverse (show (x*y)) == show (x*y)]
您不想将 reverse 函数应用于包含单个数字的列表。您需要将 reverse 函数应用于该数字的字符串表示形式。
尝试使用“显示”功能。
另外,如果你有足够的力量避免看它并破坏欧拉计划的整个目的,你可以看看这个: