我正在尝试在
Rosetta Code上尝试完成Scala中的
Hofstadter-Conway $10,000 sequence任务.我想尽可能使用惯用的Scala,但是我在实现算法时遇到了麻烦而没有使用原始递归,这通常只会作为最后的手段使用.这是我目前拥有的:
object HofstadterConway {
def makeHCSequence(max: Int): Seq[Int] = {
def hc(v: Vector[Int], idx: Int): Vector[Int] = {
if (idx == (max + 1)) {
v.tail
} else if (idx <= 2) {
hc(v :+ 1, idx + 1)
} else {
hc (v :+ (v(v(idx - 1)) + v(idx - v(idx - 1))), idx + 1)
}
}
hc(Vector(), 0)
}
}
有没有办法更惯用地做到这一点?
最佳答案 我之前会发布这个帖子,但是我没有足够的SO信誉在8小时内发布自己问题的答案,所以我不得不等待.正如@ axel22所说,这是我昨晚在Rosetta Code网站上发布的解决方案的一部分.
def makeHCSequence(max: Int): Seq[Int] =
(0 to max - 1).foldLeft (Vector[Int]()) { (v, idx) =>
if (idx <= 1) v :+ 1 else v :+ (v(v(idx - 1) - 1) + v(idx - v(idx - 1)))
}
我的问题是由于某些原因我的思绪陷入困境,试图用Vector.range或Vector.iterate来提出解决方案,但很明显的选择foldleft并没有发生在我身上.