您可以对代码应用许多直接简化,但我不认为这是最好的方法.
这是我在F#中解决这个问题的方法:
let rec tryDivide n m = if m = 1 then true else if n % m = 0 then tryDivide n (m-1) else false let rec findIt i m = if tryDivide i m then i else findIt (i+1) m findIt 1 20
它比你的慢一点,因为它不使用硬编码的素数,它们是在运行中计算的,但是我的计算机上仍需要不到2秒的时间才能得到正确的答案.
请注意,我没有使用任何类似列表的数据结构,也不需要在这个特定问题中依赖大整数.
UPDATE
这是基于Kvb提出的解决方案的更好方法:
let rec gcd x y = if y = 0 then abs x else gcd y (x % y) let lcm a b = match (a, b) with | (_, 0) | (0, _) -> 0 | (x, y) -> abs ((x / (gcd x y)) * y) Seq.fold lcm 1 {2..20}