一种基于Scala中先前索引建立数组/列表的惯用方式

时间:2019-03-26 00:58:47

标签: scala

我正在尝试使用Scala中的自回归公式建立时间序列。该方程式查找目标数组的先前索引和其他两个数组的当前索引。虚拟方程式示例: z_i = z[i-1] - x[i] + y[i]

它以命令式风格很简单(请参见下面的C ++示例),但是我试图弄清楚Scala中的惯用方式。我创建了一个带有while循环的解决方案,但它感觉笨拙且缺乏伸缩性。

#include <vector>
#include <iostream>

int main() {
  std::vector<int> x {1, 2, 3, 4};
  std::vector<int> y {10, 9, 8, 7};
  std::vector<int> z {0, 0, 0, 0};

  for(int i = 1; i < x.size(); i++) {
      z[i] = z[i-1] - x[i] + y[i];
  }

  for(auto i: z) {
      std::cout << i << std::endl;
  }
}

// Desired result
[0, 7, 12, 15]

1 个答案:

答案 0 :(得分:2)

您将希望从zx来构建它,而不是修改现有的y

val x = Vector(1, 2, 3, 4)
val y = Vector(10, 9, 8, 7)
val z = (x.tail zip y.tail).scanLeft(0){case (nz,(nx,ny)) => nz - nx + ny}
//z: Vector[Int] = Vector(0, 7, 12, 15)