Упорядочить простые множители в порядке возрастания Схема

Я новичок в 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)])))

Не могли бы вы помочь? Спасибо


person InAbuukar    schedule 14.12.2013    source источник


Ответы (3)


Я бы сказал, что сортирует, но по убыванию. Если вы хотите отсортировать по-другому, просто измените результат:

(cond [(= n 1) (reverse factors)]
person uselpa    schedule 14.12.2013
comment
Это правда, @uselpa, мне нужно определить свою собственную процедуру, чтобы отменить ее. Спасибо - person InAbuukar; 14.12.2013
comment
reverse — это процедура стандарта Scheme, поэтому вам не нужно ее писать, если только это не является целью вашего упражнения. - person uselpa; 14.12.2013

Обычно, когда вам нужно что-то отсортировать в том порядке, в котором вы их получаете, вы можете использовать их следующим образом:

(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, а с числа, которое вы нашли.

person Sylwester    schedule 14.12.2013

Какой диалект Схемы используется?

Три подсказки:

Вам нужно только проверить делители, меньшие, чем квадратный корень из вашего числа. а * б = Н ; a ‹ b ---> a ‹= sqrt( N ).

Если вам нужны все простые числа за вычетом некоторого числа, вы должны использовать сито эратотенов. См. Википедию.

Прежде чем начать писать программу, загляните в Википедию.

If

person Georg Fuss    schedule 15.12.2013
comment
Если вам нужен код для sieve. Я написал некоторые с вектором и один с использованием списка. Вышли мне электронное письмо. - person Georg Fuss; 15.12.2013