`
langzhe
  • 浏览: 289641 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于对两个list的每个元素做减法操作的讨论。

阅读更多

 

> Hi All, 

> after a long time, here I am programming in Erlang again... 

> I have 2 lists: 

> L1=[1,2,3,4,5], L2=[1.1,2.2,3.3,4.4,5.5] 

> and I want to have a third list which is the difference of them: 

> L3=[ 

> L2[1] - L1[1], 

> L2[2] - L1[2], 

> L2[3] - L1[3], 

> L2[4] - L1[4], 

> L2[5] - L1[5] 

> ] 

> The result should be 

> L3=[0.1,0.2,0.3,0.4,0.5] 

> I have tried: 

> sub(L2,L1) -> [X2-X1||X1<-L1,X2<-L2].

 

This says 

    for each X1 in L1 { 

        for each X2 in L2 { 

            include X1 - X2 in the result 

        } 

    } 

just like it does in Haskell and Clean. 

 

Direct method: 

   sub([X|Xs], [Y|Ys]) -> [X-Y | sub(Xs, Ys)]; 

   sub([],     [])     -> []. 

 

Zip then enumerate pairs: 

   sub(Xs, Ys) -> [X-Y || {X,Y} <- lists:zip(Xs, Ys)]. 

 

Zip with a function other than pairing: 

   sub(Xs, Ys) -> lists:zipwith(fun (X, Y) -> X - Y end, Xs, Ys). 

 

One expects a Haskell compiler to expand calls to zip. 

One expects an Erlang compiler NOT to, and it doesn't. 

There's an EEP proposing that you should be allowed to write 


 ** sub(Xs, Ys) -> [X-Y || X <- Xs && Y <- Ys] 


but that's not allowed in Erlang yet. 

以上内容来自 erlang_quest mail

 

我看到上面提用 直接方法和lists:zip/2 及lists:zipwith/3 三种方法解决此问题。

带着疑问看来了一下源码,原来这三种方法是的思路是一样的。

 

 list:zip/2的源码 如下

zip([X | Xs], [Y | Ys]) -> [{X, Y} | zip(Xs, Ys)];

zip([], []) -> [].

 

zipwith 的如下:

zipwith(F, [X | Xs], [Y | Ys]) -> [F(X, Y) | zipwith(F, Xs, Ys)];

zipwith(F, [], []) when is_function(F, 2) -> [].

分享到:
评论

相关推荐

    python实现list元素按关键字相加减的方法示例

    本方法的核心是定义一个函数 `ListAdd`,该函数接受两个列表作为参数,并支持一个布尔值 `bAdd` 来决定是否执行加法或减法运算。该函数的主要步骤如下: 1. **初始化字典**:首先创建一个空字典 `d` 用于存储每个...

    数据结构(C语言)用单链表存储一元多项式并实现两个多项式的相加运算.doc

    本文将以C语言为工具,详细讨论如何利用单链表的数据结构存储一元多项式,并进一步实现两个多项式的相加运算。这种实现方式不仅能够加深对数据结构特性的理解,而且有助于掌握多项式运算的实际操作。 首先,我们...

    数据结构c语言班 PPT 第二章

    - `ListTraverse(L, visit())`:遍历线性表L,对每个元素调用visit()函数。 线性表的两种主要表示方式是顺序表和链表。顺序表是通过数组实现,所有的元素在内存中连续存储,而链表则是通过节点之间的指针链接,元素...

    链表实现长整数相加减

    `PrintList`函数遍历链表并输出每个节点的数据。这通过一个临时指针`p`初始化为链表头的下一个节点开始,直到`p`不为空,即到达链表末尾,每次迭代都输出当前节点的数据。 ### 链表实现长整数的加法和减法 #### ...

    多项式加法减法和乘法源代码

    实现多项式加法的核心在于遍历两个链表,并比较每个节点的指数值。如果两个节点具有相同的指数,则它们的系数相加;如果一个节点的指数大于另一个节点的指数,则较大的指数对应的节点直接加入结果链表中。最后,将...

    一多项式的计算

    - **多项式减法**:能够对两个多项式执行减法操作,并输出结果。 #### 3. 算法设计 ##### 3.1 算法思想 为了实现以上需求,我们采用链表作为数据结构的基础,通过以下几个步骤完成: 1. **多项式的创建**:构建...

    一般线性表

    - **ListTraverse(L, visit())**:遍历线性表L,对每个元素执行访问操作`visit()`。 - **加工型操作**:改变线性表的状态,如插入、删除元素等。 - **InsertElem(L, i, e)**:在位置`i`处插入元素`e`。 - **...

    函数式编程在Python中的用法

    # 对序列中的每个元素进行减法操作 print(list(myMap(range(5), '-', 5))) # 输出 [-5, -4, -3, -2, -1] # 对序列中的每个元素进行乘法操作 print(list(myMap(range(5), '*', 5))) # 输出 [0, 5, 10, 15, 20] # 对...

    多项式的链表表示 c++实现

    加法和减法操作相对简单,我们只需遍历两个多项式的链表,对相同指数的项进行加减,不同指数的项则保持原样。如果某一项只在一个多项式中存在,那么在结果中添加或减去它即可。 乘法操作较为复杂,需要使用...

    List-the-main-element-method.rar_The Element

    3. **行交换**:使用两个临时变量交换两行的元素。 4. **行倍乘**:找到主元素,然后将矩阵的其他行元素除以主元素。 5. **行减法**:对其他行进行减法操作,需要用到主元素所在行的负倍数。 6. **回代求解**:从...

    Dart的数据类型详解 int double String bool List Maps

    例如,`List, dynamic&gt;&gt;`可以用来表示表格数据,其中每个`Map`代表一行,每个键值对对应一列。了解并熟练掌握这些基本数据类型及其操作是Dart编程的基础,对于编写高效、可靠的代码至关重要。 在学习过程中,结合...

    一元多项式的计算数据结构课程设计.pdf

    - **时间复杂度**:加法操作的时间复杂度为O(m+n),减法操作的时间复杂度为O(min(m,n)),其中m和n分别为两个多项式的项数。 7. **设计体会** 实现一元多项式的计算过程中,关键在于有效地管理和操作链表,确保...

    两个一元多项式的计算的代码(包括加减乘)链表方法

    在链表中,每个节点包含两项数据:系数和指数。例如,一个节点可能表示为 `(5, 3)`,这表示该多项式项为 \(5x^3\)。 #### 3. 数据结构定义 为了实现一元多项式的链表表示,首先需要定义链表节点的结构体类型: ``...

    顺序表和链表的基本操作和实际应用

    链表则由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表分为单链表、双链表和循环链表等类型。链表的插入和删除操作通常比顺序表更快,因为它们只需要改变几个指针,而不需要移动元素。但在访问元素...

    2017-数据结构课程设计-答案.doc

    - **Compare(List &MN1, List &MN2, int &mn1, int &mn2)**:比较两个链表中的元素,可能用于比较大小或者计算绝对值。 - **ChuangJian(List &L, int &n)**:创建双向循环链表的函数,从用户输入中读取数据并构建...

    数据结构之线性表.pptx

    线性表是数据结构的基础概念之一,它是一个包含零个或多个元素的有序集合,其中每个元素都有一个直接前驱和直接后继。线性表的抽象数据类型(ADT)定义了对这类数据结构进行操作的一组基本功能,包括创建、销毁、...

    数据结构与算法--链表 很好的哦 欢迎下载

    在C++中,单链表通常通过定义两个类来实现:`ListNode` 和 `List`。`ListNode` 类用来表示链表中的节点,包含一个整型数据成员 `data` 以及一个指向下一个节点的指针 `link`。`List` 类则用于管理链表,包含对链表的...

    一元多项式的运算实验报告

    - **实现逻辑**:遍历链表中的每个节点,将每个节点的系数取反。 ##### 其他辅助函数 - **函数名称**:`Sort` - **功能**:对多项式按指数从大到小进行排序。 - **实现逻辑**:遍历链表,比较每个节点的指数大小,...

    c++入门,包含基本实验操作,以及清晰的解说

    以下是对每个文件内容的详细解读: 1. **复数类.cpp**:在C++中,自定义类是面向对象编程的基础。复数类可能是为了介绍如何创建一个表示复数(具有实部和虚部)的对象,并实现相关操作,如加法、减法、乘法和除法。...

    c++/c长整数四则运算 doc 代码解释

    `Status`和`ElemType`是两个宏定义,分别表示操作的状态和链表中的元素类型。`InitList_DuL`用于初始化双向链表,`GetElemP_DuL`获取指定位置的元素,`ListInsert_DuL`插入元素,`ListDelete_DuL`删除元素,`List...

Global site tag (gtag.js) - Google Analytics