访问方案中的列表元素

时间:2012-11-14 05:06:24

标签: scheme

如何更改Scheme中列表的元素。 我想要一个程序将列表的最小元素更改为另一个数字,所以

如果我有一个名为proc的过程,我给它两个参数(一个列表和一个数字),我的过程就像这样: (proc (list 1 2 3 1) 9)返回'(9 2 3 9)。所以9代替列表的最小值。我知道我可以应用min来获得最小值,但我不知道如何修改列表中的单个元素。

由于Scheme没有变量来保存值,我考虑使用let或letrec,但我不知道使用let和letrec之间的区别。

2 个答案:

答案 0 :(得分:1)

这可以分为两个不同的任务 - 获取列表中的最低值,然后用我们的新值替换该值。我们可以通过在列表中运行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对其进行了测试,并且根据您问题中提供的规范执行完美。如果您有任何问题,请告诉我。

答案 1 :(得分:0)

这是使用min改进的工作解决方案:

(define (replace-min lst elt)
  (let ((m (apply min lst)))
    (map (lambda (x) (if (= x m) elt x))
         lst)))

请注意,min是查找列表中最小元素的最简单方法。