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