我有一个函数f(a: A): A
和一个整数N
。我想编写一个函数,它将返回以下Vector [A]:
Vector(a, f(a), f(f(a)), f(f(f(a))), ..., f^{N}(a))
其中f^{N}
表示递归f
次递归N
。 N
可能相对较大。我正在寻找一种解决方案,它不需要反转数据结构或多次遍历它。显然,有很多方法可以做到这一点;我正在寻找功能性,惯用性和可读性的代码。
答案 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) }