在没有原始递归的情况下实现Hofstadter-Conway算法

时间:2011-07-15 02:59:20

标签: algorithm scala recursion rosetta-code

我正在尝试在Hofstadter-Conway $10,000 sequence上尝试完成Scala中的Rosetta Code任务。我希望尽可能使用惯用的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)
 }
}

有没有办法更惯用地做到这一点?

1 个答案:

答案 0 :(得分:2)

我之前会发布这个帖子,但我没有足够的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。