(схема) Минусы номер в передней части подсписки?

У меня есть функция, которая находит расстояние в 2 координаты и помещает его перед соответствующим подсписком. Прямо сейчас он находит только расстояние первых координат. Я думаю, что с рекурсией что-то не так, поскольку она, похоже, не переходит к другим координатам.

Вот что должно происходить:

~(storedist distance '(1 7) '((d (1 8)) (d (2 9))))
((1 (d (1 8))) (2 (d (2 9))))

Вот что происходит с моим кодом:

~(storedist distance '(1 7) '((d (1 8)) (d (2 9))))
(1 (d (1 8))) (d (2 9)))

Как я могу это исправить?

(define (store-dist dist coord data)
 (if (null? data) '()
  (if (null? (cdr data)) data
      (cons (dist coord (car (list (cadar data)))) 
        (store-dist dist coord (list (cdr data)))))))

2 ответа

Решение

Последняя часть процедуры не верна. Для двух координат это даже не обязательно должна быть рекурсия (при условии, что все параметры не равны нулю):

(define (store-dist dist coord data)
  (list (list (dist coord (cadar data))
              (car data))
        (list (dist coord (cadadr data))
              (cadr data))))

Для более общего подхода (списки с более чем двумя координатами) используйте рекурсию:

(define (store-dist dist coord data)
  (if (null? data)
      '()
      (cons (list (dist coord (cadar data))
                  (car data))
            (store-dist dist coord (cdr data)))))

Это был бы самый простой рекурсивный подход к проблеме такого типа; Однако многое зависит от dist код и структура вашего списка:

(define (store-dist dist coord data)
  (if (null? data)
      '()
       (cons (dist coord (car data))
             (store-dist dist coord (cdr data)))))

В приведенном выше dist функция должна была бы развернуть / разобрать '(d (<x> <y>)) состав; иначе использовать cadr, Вот кандидат:

(define dist
  (let ((count 0))
    (lambda (c1 dthingy)
      (set! count (+ 1 count))
      `(,count (d (,dx ,dy))))))  ;; figure out dx, dy
Другие вопросы по тегам