Определение уникальных пар процедуры


В разделе вложенных отображений

Упражнения 2.40

Определить порядок уникальный пар, что, учитывая целое число п, генерирует последовательность пар (я,Дж) с 1 < Дж < я < Н. Используйте уникальные-пар упростить определение премьер-сумма-пар приведены выше.

Я написал следующее:

(define (prime-sum-pairs n)
  (filter (lambda (seq)
            (prime? (+ (car seq) (cadr seq))))
          (unique-pairs n)))

(define (enumerate-integers start end)
  (if (>= start end)
      (list end)
      (cons start (enumerate-integers (+ 1 start) end))))

(define (unique-pairs n)
  (flat-map (lambda (i) 
              (map (lambda (j) (list i j)) 
                   (enumerate-integers 1 (- i 1))))
            (enumerate-integers 2 n)))

(define (filter test-fn seq)
  (if (null? seq) null
      (if (test-fn (car seq)) 
          (cons (car seq)                    
                (filter test-fn (cdr seq)))
          (filter test-fn (cdr seq)))))


(define (accumulate op initial seq)
  (if (null? seq)
      initial
      (op (car seq)
          (accumulate op initial (cdr seq)))))

(define (flat-map f seq)
  (accumulate append
              null
              (map (lambda (x) (f x)) seq)))

(define (prime? n) (= (smallest-divisor n) n))
(define (divisible? n i) (= 0 (remainder n i)))
(define (square x) (* x x))
(define (smallest-divisor n)
  (define (rec i)
    (cond ((> n (square i)) n)
          ((divisible? n i) i)
          (else (rec (+ 1 i)))))
  (rec 2))

Это может быть улучшено в любом случае?



389
1
задан 13 апреля 2011 в 06:04 Источник Поделиться
Комментарии
1 ответ

Ваш код

(define (enumerate-integers start end)
(if (>= start end)
(list end)
(cons start (enumerate-integers (+ 1 start) end))))

(define (unique-pairs n)
(flat-map (lambda (i)
(map (lambda (j) (list i j))
(enumerate-integers 1 (- i 1))))
(enumerate-integers 2 n)))

выглядит нормально для меня. Если вы хотите массаж некоторые детали, вы могли бы переписать перечислять-целые числа например:

(define (enumerate-integers start end)
(if (> start end) '()
(cons start (enumerate-integers (+ 1 start) end))))

что чище, потому что вас нет (список в конце) как особый случай, и вы сможете правильно произвести пустой список целых чисел, если пуск > конец.

Если вы хотите быть еще чище, вы можете сделать:

(define (enumerate-integers start end)
(define (iter n)
(if (> n end) '()
(cons n (iter (+ n 1)))))
(iter start))

Это хороший шаблон в случае более сложных процедур.

Ваша квартира-карту сложнее, чем это необходимо, ваш код:

(define (flat-map f seq)
(accumulate append
null
(map (lambda (x) (f x)) seq)))

можно заменить:

(define (flat-map f seq)
(accumulate append
null
(map f seq)))

потому что (лямбда (Х) (Х ф)) равен F.

3
ответ дан 15 апреля 2011 в 01:04 Источник Поделиться