如何更改方案中列表的元素。我想要一个将列表的最小元素更改为另一个数字的过程,所以
如果我有一个名为 proc 的过程,并且我给它两个参数(一个列表和一个数字),我的程序将像这样工作: (proc (list 1 2 3 1) 9)
返回'(9 2 3 9)
.所以 9 取代了列表的最小值。我知道我可以应用 min 来获取最小值,但我不知道如何修改列表中的单个元素。
由于 Scheme 没有变量来保存值,我想过使用 let 或 letrec,但我不知道使用 let 和 letrec 有什么区别。
这可以分为两个不同的任务 - 获取列表中的最低值,然后将该值替换为我们的新值。我们可以通过在列表上运行 sort
函数并按从最小到最大排序,然后使用 apply min
获取列表的第一个元素来获取最低值。
这个,我们可以使用map
来浏览列表,用我们的新数字替换任何最低数字的实例。总而言之,完整的函数应该看起来像这样:
(define (replace-least lst new)
(let ((lowest (apply min lst)))
(map (lambda (x) (if (= x lowest) new x)) lst)))
我用DrRacket 5.3对此进行了测试,它按照您问题中提供的规格完美运行。如果您有任何问题,请告诉我。
改进的工作解决方案,使用min
:
(define (replace-min lst elt)
(let ((m (apply min lst)))
(map (lambda (x) (if (= x m) elt x))
lst)))
请注意,min
是在列表中查找最小元素的最简单方法。