Схема зацикливания списка - PullRequest
0 голосов
/ 25 октября 2010

Я пытаюсь написать некоторый код, который будет проходить по списку и добавлять подобные термины. Я пытаюсь cons cdr из списка ввода в нулевой список, а затем просто сравнить car списка с car нового списка и пройти вниз по списку, но мой код просто нет не работает Что я тут не так делаю?

  (define loop-add
  (lambda (l temp outputList)
    (if (or (equal? (cdr l) '()) (equal? (pair? (car l)) #f))
        outputList
        (if (equal? l '())
            outputList
            (let ((temp (cdr l)))
              (if (equal? temp '())
                  (loop-add (cdr l) outputList)
                  (if (equal? (cdr (car l)) (cdr (car temp)))
                      (loop-add l (cdr temp) (cons (append (cdr (car l)) (cdr (car (cdr l)))) outputList))
                      (loop-add l temp outputList))))))))

но проблема сейчас в том, что в конце она просто станет бесконечным циклом. Мне нужен способ для повторения с входным списком, но с временным значением, являющимся cdr предыдущего временного списка.

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Вот простое решение в Racket:

(define (loop-add l)
  (define table
    (for/fold ([h (hash)]) ([i l])
       (dict-update h (cadr i) (lambda (v) (+ v (car i))) 0)))
  (dict-map table (lambda (key val) (list val key))))

(loop-add '((2 1) (3 4) (5 3) (2 4)))
1 голос
/ 25 октября 2010

Начните с написания процедуры, которая может преобразовать ваш входной список в новый список уникальных терминов в исходном списке, поэтому

(get-unique-terms '((2 1) (3 4) (5 3) (2 4)))
<i>(1 4 3)</i> ; or something like that

Назовите этот новый список УСЛОВИЯ. Теперь для каждого элемента в СРОКАХ вы можете искать в исходном списке подходящие элементы и получать сумму коэффициентов:

(define (collect-like-terms l)
  (let ((terms (get-unique-terms l)))
    ;; For each element of TERMS,
    ;;   Find all elements of L which have a matching term,
    ;;      Sum the coefficients of those elements,
    ;;      Make a record of the sum and the term a la L.
    ;; Collect the results into a list and return.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...