> 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) -> [].
分享到:
相关推荐
本方法的核心是定义一个函数 `ListAdd`,该函数接受两个列表作为参数,并支持一个布尔值 `bAdd` 来决定是否执行加法或减法运算。该函数的主要步骤如下: 1. **初始化字典**:首先创建一个空字典 `d` 用于存储每个...
本文将以C语言为工具,详细讨论如何利用单链表的数据结构存储一元多项式,并进一步实现两个多项式的相加运算。这种实现方式不仅能够加深对数据结构特性的理解,而且有助于掌握多项式运算的实际操作。 首先,我们...
- `ListTraverse(L, visit())`:遍历线性表L,对每个元素调用visit()函数。 线性表的两种主要表示方式是顺序表和链表。顺序表是通过数组实现,所有的元素在内存中连续存储,而链表则是通过节点之间的指针链接,元素...
`PrintList`函数遍历链表并输出每个节点的数据。这通过一个临时指针`p`初始化为链表头的下一个节点开始,直到`p`不为空,即到达链表末尾,每次迭代都输出当前节点的数据。 ### 链表实现长整数的加法和减法 #### ...
实现多项式加法的核心在于遍历两个链表,并比较每个节点的指数值。如果两个节点具有相同的指数,则它们的系数相加;如果一个节点的指数大于另一个节点的指数,则较大的指数对应的节点直接加入结果链表中。最后,将...
- **多项式减法**:能够对两个多项式执行减法操作,并输出结果。 #### 3. 算法设计 ##### 3.1 算法思想 为了实现以上需求,我们采用链表作为数据结构的基础,通过以下几个步骤完成: 1. **多项式的创建**:构建...
- **ListTraverse(L, visit())**:遍历线性表L,对每个元素执行访问操作`visit()`。 - **加工型操作**:改变线性表的状态,如插入、删除元素等。 - **InsertElem(L, i, e)**:在位置`i`处插入元素`e`。 - **...
# 对序列中的每个元素进行减法操作 print(list(myMap(range(5), '-', 5))) # 输出 [-5, -4, -3, -2, -1] # 对序列中的每个元素进行乘法操作 print(list(myMap(range(5), '*', 5))) # 输出 [0, 5, 10, 15, 20] # 对...
加法和减法操作相对简单,我们只需遍历两个多项式的链表,对相同指数的项进行加减,不同指数的项则保持原样。如果某一项只在一个多项式中存在,那么在结果中添加或减去它即可。 乘法操作较为复杂,需要使用...
3. **行交换**:使用两个临时变量交换两行的元素。 4. **行倍乘**:找到主元素,然后将矩阵的其他行元素除以主元素。 5. **行减法**:对其他行进行减法操作,需要用到主元素所在行的负倍数。 6. **回代求解**:从...
例如,`List, dynamic>>`可以用来表示表格数据,其中每个`Map`代表一行,每个键值对对应一列。了解并熟练掌握这些基本数据类型及其操作是Dart编程的基础,对于编写高效、可靠的代码至关重要。 在学习过程中,结合...
- **时间复杂度**:加法操作的时间复杂度为O(m+n),减法操作的时间复杂度为O(min(m,n)),其中m和n分别为两个多项式的项数。 7. **设计体会** 实现一元多项式的计算过程中,关键在于有效地管理和操作链表,确保...
在链表中,每个节点包含两项数据:系数和指数。例如,一个节点可能表示为 `(5, 3)`,这表示该多项式项为 \(5x^3\)。 #### 3. 数据结构定义 为了实现一元多项式的链表表示,首先需要定义链表节点的结构体类型: ``...
链表则由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表分为单链表、双链表和循环链表等类型。链表的插入和删除操作通常比顺序表更快,因为它们只需要改变几个指针,而不需要移动元素。但在访问元素...
- **Compare(List &MN1, List &MN2, int &mn1, int &mn2)**:比较两个链表中的元素,可能用于比较大小或者计算绝对值。 - **ChuangJian(List &L, int &n)**:创建双向循环链表的函数,从用户输入中读取数据并构建...
线性表是数据结构的基础概念之一,它是一个包含零个或多个元素的有序集合,其中每个元素都有一个直接前驱和直接后继。线性表的抽象数据类型(ADT)定义了对这类数据结构进行操作的一组基本功能,包括创建、销毁、...
在C++中,单链表通常通过定义两个类来实现:`ListNode` 和 `List`。`ListNode` 类用来表示链表中的节点,包含一个整型数据成员 `data` 以及一个指向下一个节点的指针 `link`。`List` 类则用于管理链表,包含对链表的...
- **实现逻辑**:遍历链表中的每个节点,将每个节点的系数取反。 ##### 其他辅助函数 - **函数名称**:`Sort` - **功能**:对多项式按指数从大到小进行排序。 - **实现逻辑**:遍历链表,比较每个节点的指数大小,...
以下是对每个文件内容的详细解读: 1. **复数类.cpp**:在C++中,自定义类是面向对象编程的基础。复数类可能是为了介绍如何创建一个表示复数(具有实部和虚部)的对象,并实现相关操作,如加法、减法、乘法和除法。...
`Status`和`ElemType`是两个宏定义,分别表示操作的状态和链表中的元素类型。`InitList_DuL`用于初始化双向链表,`GetElemP_DuL`获取指定位置的元素,`ListInsert_DuL`插入元素,`ListDelete_DuL`删除元素,`List...