You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell含let与show的列表推导式作用及欧拉计划第4题解析

关于欧拉计划第4题Haskell代码的疑问解答

首先明确题目背景:

欧拉计划第4题要求:找出两个三位数乘积中的最大回文数

你给出的解题代码是:

problem_4 = maximum [x | y<-[100..999], z<-[y..999], let x=y*z, let s=show x, s==reverse s]

接下来逐个解答你的疑问:

1. 代码中s的作用是什么?

s在这里是字符串形式的乘积值,核心作用是帮我们轻松判断乘积是否为回文数:

  • show x会把整数类型的乘积x转换成对应的字符串(比如x=121时,show x得到"121");
  • reverse s会把字符串s反转(比如"121"反转后还是"121",而"123"反转后是"321");
  • 最后通过s == reverse s判断字符串是否回文——如果相等,说明原整数x是回文数,反之则不是。
    用字符串判断回文是Haskell里很简洁的做法,比直接操作整数逐位判断要直观得多。

2. 列表推导式|右侧是否都应为约束条件?

当然不是!列表推导式|后面的内容可以分成三类,各司其职:

  • 生成器:比如y<-[100..999]和z<-[y..999],这部分是遍历生成基础的数值组合,是整个推导的“数据源”;
  • 变量绑定:比如let x=y*z、let s=show x,这部分是给中间结果赋值,方便后续的计算和判断,相当于提前把复杂表达式存成变量;
  • 过滤约束(Guard):只有s==reverse s这部分是约束条件——只有满足这个条件的x才会被保留到最终列表里,不符合的会被直接过滤掉。

3. 每次生成新列表元素时|右侧内容是否都会执行?

是的,每一组y和z的组合都会完整执行|右侧的所有步骤,顺序是固定的:

  1. 先取一个y值(从100到999依次遍历);
  2. 对当前y,取一个z值(从y到999依次遍历,这样做是为了避免重复计算y*z和z*y,提高效率);
  3. 计算x=y*z,把结果绑定给x;
  4. 把x转成字符串绑定给s;
  5. 检查s==reverse s是否成立:如果成立,就把x加入结果列表;不成立就跳过这个组合。
    整个过程按顺序逐组执行,直到所有y和z的组合都遍历完毕。

内容的提问来源于stack exchange,提问作者user6791424

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:18:31