首页 文章

访问方案中的列表元素

提问于
浏览
1

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

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

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

2 回答

  • 0

    这可以分为两个不同的任务 - 获取列表中的最低值,然后用我们的新值替换该值 . 我们可以通过运行列表中的 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

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

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

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

相关问题