【问题标题】:Replace an element in a list in Scheme替换 Scheme 中列表中的元素
【发布时间】:2011-04-30 09:56:36
【问题描述】:

我在 Scheme 中寻找一个函数,用一个值替换方程中的元素。

例如:'(+ a b c a)(1 2 3) 应该给我'(+ 1 2 3 1)(我不想解方程,这只是一个例子)

基本上我想说a=1, b=2, c=3

为了继续,我将第一个列表的变量提取到另一个列表中。 然后,我在另一个列表中收到了预期值。 现在,我想给变量赋值。

关于我如何进行的任何提示? 非常感谢。

【问题讨论】:

  • 您是否存储了a->1b->2 等的映射,或者这两个列表中元素的顺序是决定因素?
  • 是的。但是变量可以出现不止一次。
  • 对这个或那个问题回答“是”,虽然非常程序员,但不会告诉我们任何信息。另外,如果它在顺序中,那么为什么要排除+?
  • 我误读了他的评论。我应该回答的是,决定因素是元素的顺序。我的错,谢谢格雷格。

标签: list function replace scheme


【解决方案1】:

您可以使用类似于((a 1) (b 2) (c 3)) 的映射“关联列表”。

assq 可以检索匹配对。因此,对于原始列表中的所有内容,您可以使用 assq 查找并替换它。

所以:

  (lambda (ls a-list)
    (map (lambda (x)
           (let ((lookup (assq x a-list)))
             (if lookup
                 (cadr lookup)
                 x)))
         ls)))

将获取一个列表和一个关联列表,并将原始列表中的所有内容替换为其替换项(如果有的话)。

【讨论】:

  • 谢谢。我要试一试!
  • 好吧,正是我想要的。非常感谢!我明天会将您的答案标记为已解决。
【解决方案2】:

这不是let 做的吗?

> (let ((a 1) (b 2) (c 3))
     (+ a b c b))
=> 8

如果您不想计算表达式:

> (let ((a 1) (b 2) (c 3))
    `(+ ,a ,b ,c ,a))
=> (+ 1 2 3 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多