Реализация алгоритма Хофштадтера-Конвея без необработанной рекурсии - PullRequest
4 голосов
/ 15 июля 2011

Я пытался выполнить задачу последовательность Хофштадтера-Конвея за $ 10000 в 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 Ответ

2 голосов
/ 15 июля 2011

Я собирался опубликовать это ранее, но у меня недостаточно 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, очевидный выбор складывания влево мне просто не удался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...