首页 > 解决方案 > 使用地图的 Scala 中的 zipWith

问题描述

定义 zipWith。它应该压缩两个列表,但不是将元素压缩成一个元组,它应该使用一个函数来组合两个元素。

示例: zipWith(List(1, 2, 3), List(10, 11, 12), (x: Int, y: Int) => x+y) 应该返回: List(11,13,15)

使用地图和邮编。

def zipWith[A,B,C](xs: List[A], ys: List[B], f: (A, B) => C): List[C] = {
        val zs = xs.zip(ys)
        //I don't know how to do this because if myMap(zs, f) 

        //myMap takes a functin f:(a)=>b instead of f: (A, B) => C
    }
}

标签: scaladictionaryzip

解决方案


听起来你在寻找这样的东西:

def zipWith[A,B,C](xs: List[A], ys: List[B], f: (A, B) => C): List[C] = {
  (xs, ys) match {
    case (Nil, _) => Nil
    case (_, Nil) => Nil
    case (x :: xs, y :: ys) => f(x, y) :: zipWith(xs, ys, f)
  }
}

希望有帮助。

更新

这是相同的函数,但是是尾递归的:

    def zipWith[A, B, C](xs: List[A], ys: List[B], f: (A, B) => C): List[C] = {
      @tailrec
      def zipAccumulatingResult(xs: List[A], ys: List[B], f: (A, B) => C, acc: List[C]): List[C] = {
        (xs, ys) match {
          case (Nil, _) => acc
          case (_, Nil) => acc
          case (x :: xs, y :: ys) => zipAccumulatingResult(xs, ys, f, acc :+ f(x, y))
        }
      }

      zipAccumulatingResult(xs, ys, f, Nil)
    }

推荐阅读