gpt4 book ai didi

list - 如何处理传递给 Racket 函数的可变数量的参数?

转载 作者:行者123 更新时间:2023-12-04 21:58:09 35 4
gpt4 key购买 nike

我喜欢创建带有无限数量参数的函数,并且能够将它们作为一个列表来处理。在创建二叉树时它对我很有用,我现在将它用于最近邻算法的变体。然而,我的方法真的很糟糕:因为我想不出一种方法来迭代不正确的列表(这很可能是不正确的和退化的),所以我尝试使用各种列表函数将不正确的列表强制转换为列表形式。

这是我在确定 map 节点之间差异的简单函数中的最佳尝试(有效,只是不确定它为什么有效):

(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

( map 节点 (a) 和 m-n (b) 之间的距离为 2,加上 map 节点 (b) 和 map 节点 (c) 之间的距离为 2)。

或者,可以简单地输入:
(distance-between (map-node 1 2) (map-node 2 2))

并得到以下答案:
1

如果我在原始输入上尝试此操作,而没有我的 (let ([input-list...])...) 语句,则会导致错误为 (? 实际上不确定为什么要回答这个问题)。

该功能按预期工作。

最佳答案

作为可变参数列表接收的列表没有任何不妥之处(意思是:可变数量的参数)。例如:

(define test-list
(lambda xs
(length xs))) ; xs is a normal list, use it like any other list

(test-list 1 2 3 4)
=> 4

在上面的例子中, xs参数是一个普通的、简单的、普通的列表,它没有任何不妥之处。您可以像遍历任何其他列表一样遍历它。没必要 car它,它已经是一个 list !另外,请注意,可以像这样编写相同的函数:
(define (test-list . xs)
(length xs)) ; xs is a normal list, use it like any other list

仅供引用:不正确的列表是不以空列表结尾的列表。例如: '(1 2 3 . 4) .同样,这不是可变参数列表的外观。

关于list - 如何处理传递给 Racket 函数的可变数量的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18211198/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com