递归地构建一个向量

时间:2014-04-01 06:55:24

标签: scala functional-programming scala-collections

我有一个函数f(a: A): A和一个整数N。我想编写一个函数,它将返回以下Vector [A]:

Vector(a, f(a), f(f(a)), f(f(f(a))), ..., f^{N}(a))

其中f^{N}表示递归f次递归NN可能相对较大。我正在寻找一种解决方案,它不需要反转数据结构或多次遍历它。显然,有很多方法可以做到这一点;我正在寻找功能性,惯用性和可读性的代码。

2 个答案:

答案 0 :(得分:5)

{Vector,List,Array,...}。iterator

def iterate[A](start: A, len: Int)(f: (A) ⇒ A): Vector[A]

  

制作一个   包含重复应用函数的集合   值。启动集合len的起始值的数量   集合中包含的元素f重复的功能   applied返回序列开始时具有len值的集合,    f(开始),f(f(开始)),...

scala> def f(x: Int): Int = if(x%2 == 0) x/2 else 3*x+1
f: (x: Int)Int

scala> Vector.iterate(10000, 10)(f)
res0: scala.collection.immutable.Vector[Int] = 
 Vector(10000, 5000, 2500, 1250, 625, 1876, 938, 469, 1408, 704)

或者如果你真的想自己实现它,这是一个可能的解决方案

scala> def iterator[A](start: A, len: Int)(f: A => A): Vector[A] = len match {
     |   case 0 => Vector()
     |   case _ => start +: iterator(f(start), len-1)(f)
     | }
iterator: [A](start: A, len: Int)(f: A => A)Vector[A]

scala> iterator(10000, 100)(f)
res1: Vector[Int] = Vector(10000, 5000, 2500, 1250, 625, 1876, 938, 469, 1408, 
704, 352, 176, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 
1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 
1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 
1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4)

答案 1 :(得分:1)

(1 to N).foldLeft(Vector(a)) { (acc, a) => acc :+ f(acc.last) }