0

我有一个函数可以找到 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)))))))
4

2 回答 2

0

这将是解决此类问题的最简单的递归方法;但是,很大程度上取决于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
于 2013-04-03T20:33:28.177 回答
0

程序的最后一部分是不对的。对于两个坐标,这甚至不需要是递归(假设所有参数都是非空的):

(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)))))
于 2013-04-03T20:37:25.090 回答