[欧拉计划]第12题有什么好的解法

可以用素数表

三角数表示成 n * (2*n ± 1)

记录n的所有质数因子 很大的概率会重复

用一个函数计算质数因子所能生成的全部因子的个数

n的所有质数因子 和 2n±1有什么关系呢

比如20 -> 1,2,4,5,10,20,如果得到2,那么肯定能得到10,不用再多计算一次

顺便问一下,这个scheme好像没有range的实现啊,另外有没有方法实现重复序列?

一般来说,「Scheme 好像没有 range 的实现」这个问题不太合适。因为 Scheme 的标准(不考虑 r6rs 的 libraries 和未来的 r7rs-large)很小,各家实现都会自己添加很多模块。SRFI 是 Scheme 社区的一个努力,会提供一些标准之外的,希望各个实现能提供的功能。一般各大实现都是 rnrs 标准 + 一些 srfi + 其他自己的模块这样。

List 相关的 srfi 主要就是 srfi-1 了,找了一下,里面有一个 iota 函数,应该是你想要的功能。另外 srfi-42 提供的 list comprehension 功能也会有帮助吧。


不太清楚「重复序列」是什么意思

(repeat 2 3) ;; (3 3)
(repeat 3) ;; (3 3 3 3.....)都是3

这个问题有点难,又去找了一下,在 srfi-41 stream(可以理解为 lazy 的 list)里有这样一个函数: stream-constant 不过和你的需求有点差别:

(stream-constant 1)      ; ⇒ 1 1 1 ...
(stream-constant #t #f)  ; ⇒ #t #f #t #f #t #f ...

差异可以自己处理一下。

我还想再说一句,take在哪里
(take 1 '(1 2 3)) ;(1)

srfi-1 里应该有的,你可以先看一下它的文档

其实我早给了能降到 30ms 的方法。

完整的解法我贴在 project Euler 的论坛了