(СХЕМА) Как мне разделить этот список? - PullRequest
0 голосов
/ 19 ноября 2010

Как мне реализовать это в схеме:

* ВХОД: ((1. 1) (1. 7))

* ВЫХОД: (((1. 2) (1. 4) (1. 6)) ((1. 3) (1. 5) (1. 7)))

в основном у меня один список с двумя элементами.Каждый элемент также является списком с двумя элементами, оба целые числа> = 0 и <8 </p>

Я должен создать это:

input ((a1 . b) (a1 . c)) 

output: (if (and (= a1 a2) (odd? b))
          While < b c
             (list (a1 . b+1) (a1 . b+3) (a1 . b+n)...)) 
             (list (a2 . b) (a2 . b+2) (a2 . b+4)...)

1 Ответ

0 голосов
/ 20 ноября 2010

«Разделение списка»

Примечание: (a . b) - неправильный список.Это минусы или пара .
См. Другую обработку ниже, где input - список, но left и справа являются минусами es:

Заданный ввод: ((a1 . b) (a2 . c))
слева: (car input)
справа: (cadr input)
a1:(car left)
a2: (car right)
b: (cdr left)
c: (cdr right)

Генерация списка нечетных и четных пар:

создайте процедуру запуска (здесь она называется Hawaiian ), которая разделяет входные данные, как указано выше.Этот стартер будет вызывать генератор рекурсивных списков, который в этом примере называется Hawaii :

;;; ((abscissa0 . start) (abscissa1 . end )) => 
;;;    (Hawaii start end abscissa '() '()) 
;;; When abscissa0 == abscissa1
(define (Hawaiian pairs)
  (let* ((first (car pairs))
     (second (cadr pairs))
     (start (cdr first))
...
(Hawaii start end abscissa0 '() '()))))

Как вы заметили, Hawaii вызывается с двумя пустыми списками, инициализаторы длярезультаты: список нечетных и четных пар.

Подпрограмма Гавайи отсчитывает назад от финиша до начала добавления к соответствующему списку odds of evens в зависимости от того, является ли текущее число нечетным или четным.После добавления он снова вызывает себя (с меньшим счетом), пока текущий счет не станет началом.

Первая и последняя строки Гавайи :

;;; start end abscissa null null => (list odds evens)
;;; odds  = (list (abscissa . start) ... (abscissa . start+2)  ...)
;;; evens = (list (abscissa . start+1) ... (abscissa . start+3) ...)
(define (Hawaii start current abscissa odds evens)
  ;; Counting backward (start <- current )
  (let((new-el (cons abscissa current)))
    (if (=  current start)
     (list (cons new-el odds) evens)
     (let* ((next...
            (elist...
              ... ))
  (Hawaii start next abscissa olist elist)))))

Чтобы завершить Hawaii rountine, добавьте три строки (1 на каждую '...'):
1. Вычислите next , значение current в следующей итерации.
2. Вычислить olist : если current нечетно, то olist = new-el + коэффициенты * * 1 081;в противном случае это просто шансы , опять же.
3. То же самое для elist .Добавьте new-el к evens или просто передайте evens вместе в зависимости от того, является ли current четным или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...