考虑以下命令式代码,它在 3 位数字的乘积中找到最大的回文数(是的,这是“[18 世纪杰出数学家] 项目”网站的第一个任务):
curmax = 0
for i in range(999,100):
for j in range(999,100):
if ((i*j) < curmax): break
if (pal(i*j)):
curmax = i*j
break
print curmax
当我目前正在学习 Haskell 时,我的问题是,你如何将这个(以及基本上任何包含比普通迭代更复杂的东西的命令式构造,例如中断、继续、临时变量和所有这些)翻译成 Haskell?
我的版本是
maxpal i curmax
| i < 100 = curmax
| otherwise = maxpal (i-1) (innerloop 999)
where
innerloop j
| (j < 100) || (p < curmax) = curmax
| pal p = p
| otherwise = innerloop (j-1)
where p = i*j
main = print $ maxpal 999 0
但这看起来我们仍然处于势在必行的丑陋之城。
那么你有什么建议,处理这种情况的方法是什么?