«Разделение списка»
Примечание: (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 четным или нет.