2013-12-14 47 views
0

我是Scheme新手,我想将数字的素数因子按升序排序。我发现这个代码,但它不排序。按照升序对素因素进行排序计划

(define (primefact n) 
(let loop ([n n] [m 2] [factors (list)]) 
    (cond [(= n 1) factors] 
     [(= 0 (modulo n m)) (loop (/ n m) 2 (cons m factors))] 
     [else (loop n (add1 m) factors)]))) 

你可以请帮忙。 谢谢

回答

1

我会说这是排序,但降序。如果你想在其他的方式排序,只是扭转结果:

(cond [(= n 1) (reverse factors)] 
+0

这是真的@uselpa,我需要定义我自己的过程来扭转它。 Thankx – InAbuukar

+0

'reverse'是Scheme标准中的一个程序,所以你不应该写一个,除非它是你练习的目标。 – uselpa

+0

谢谢uselpa。 – InAbuukar

0

通常,当你需要的东西的顺序排序,你让他们可以 缺点他们是这样的:

(define (primefact-asc n) 
    (let recur ((n n) (m 2)) 
    (cond ((= n 1) '()) 
      ((= 0 (modulo n m)) (cons m (recur (/ n m) m))) ; replaced 2 with m 
      (else (recur n (+ 1 m)))))) 

注意这不是尾递归,因为它需要考虑结果,但由于答案中的因素数量很少(可能是数千),所以它并不重要。

此外,因为它确实找到了因素,所以您不需要从每一轮都开始2,而是找到您找到的号码。

0

使用Scheme的哪种方言?

三提示:

你只需要测试除数为你数的平方根大致相等。 a * b = N; a < b - > a < = sqrt(N)。

如果你需要所有素数减少一些数字,你应该使用eratothenes筛。请参阅维基百科。

在开始编写程序之前,请查看维基百科。

如果

+0

如果您需要筛选代码。我写了一些矢量和一个使用列表。传一个电子邮件给我。 –