(схема) Минусы номер в передней части подсписки?
У меня есть функция, которая находит расстояние в 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