【问题标题】:How to use Map/Reduce in Scheme?如何在 Scheme 中使用 Map/Reduce?
【发布时间】:2021-02-28 23:13:24
【问题描述】:

所以我的 CS 课程有一个家庭作业,涵盖了 Scheme 程序。我们上周才开始学习这门语言,所以我不知道如何回答这个问题。我知道 map 过程可以得到两个列表的点积,但我认为不需要 reduce 来获得产品。下面是他给出的示例代码,它反转了一个列表以及关于函数卷积和点积的问题。我也对列表 y 的等式以及如何实际阅读它感到困惑。任何帮助将不胜感激。

(define (reverse lis)   
       (if (null? lis)       
          '()      
          (append (reverse (cdr lis))               
                  (list (car lis))))) 

在 Scheme 中绘制一个函数卷积,计算列表 x 与列表 y 的倒数的点积:

您可以使用 map/reduce 方法,遍历列表并使用递归调用添加每个产品,或使用您希望的任何方法。

【问题讨论】:

  • reduce 部分来自计算各个乘法的总和。它通常被称为方案中的折叠。

标签: mapreduce scheme procedure


【解决方案1】:

可能有点晚了,但这里是:

等式中的 Sigma 基本上可以使用 reduce (reduce + list-of-values) 计算,但可以简单地将所有不需要 reduce 的项目相加,因为您可以使用 (apply + list-of-values)。 map 部分可用于计算两个列表中的数字列表。请注意,Scheme 没有定义 reduce,但您可以使用:

(fold-left + 0 '(1 2 3))

0 是初始值

地图工作如下:

你可以传递单个列表:

(map square (list 1 2 3))

但实际上 map 接受任意数量的列表作为参数:

(map * (list 1 2 3) (list 3 4 5))

这将返回 3 个元素的列表,其中第一个元素是列表中的第一个元素与第二个列表中的第一个元素相乘。所以这就像加入两个列表并返回单个列表。

要获得正确的列表作为输出,您只需反转给定列表并将其作为原始列表的参数之一传递。 然后总结结果列表。你应该为此写一个不错的函数:

(define (dot l)
   ...)

现在您应该可以自己编写点函数了。抱歉,如果您自己提供代码,您将永远学不会。一切都解释清楚了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多