我喜欢创建带有无限数量参数的函数,并且能够将它们作为列表处理。它在创建二叉树时对我很有用,我现在正在使用它来改进最近邻算法。然而,我的方法真的很糟糕:因为我想不出一种方法来迭代不正确的列表(这很可能是不正确的和退化的),我尝试使用各种列表函数来强制不正确的列表变成列表形式。
这是我在一个简单的函数中确定地图节点之间差异的最佳尝试(有效,只是不确定它为什么有效):
(define distance-between
(lambda xs
(let ([input-list (list* xs null)])
(letrec
([f (lambda (xs acc)
(if (null? (cdr xs))
acc
(f (cdr xs)
(+ (abs (- (map-node-x (car xs))
(map-node-x (cadr xs))))
(abs (- (map-node-y (car xs))
(map-node-y (cadr xs))))
acc))))])
(f (car input-list) 0)))))
如您所见,这是一个丑陋的解决方案,并且涉及一些对我来说似乎很神奇的东西 - 为什么当我将不正确的列表包含在列表中时,它会被强制转换为列表形式*?(注意:这句话具有误导性,这不会发生)。
我宁愿有一个漂亮的解决方案,没有魔法。任何人都可以帮忙吗?
例如,典型的输入是:
(distance-between (map-node 1 2) (map-node 2 3) (map-node 3 4))
与预期的结果:
4
(地图节点(a)和mn(b)之间的距离为2,加上地图节点(b)和地图节点(c)之间的距离为2)。
或者,可以简单地输入:
(distance-between (map-node 1 2) (map-node 2 2))
并得到以下答案:
1
如果我在原始输入上尝试此操作,而没有我的 (let ([input-list...])...) 语句,则会导致错误,因为 (? 实际上不确定为什么要回答这个问题)。
该功能按预期工作。