(计划)在子列表前面加上一个数字?

时间:2013-04-03 20:19:50

标签: scheme

我有一个函数可以找到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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)))))