2011-07-15 3 views
4

Rosetta CodeのScalaのHofstadter-Conway $10,000 sequenceタスクを試してみました。私は可能な限り慣用的なScalaとして使用したいですが、私は、通常は最後の手段として使用する未処理の再帰を使わずにアルゴリズムを実装するのに問題があります。ここに私が現在持っているものがあります:生の再帰を使わないHofstadter-Conwayアルゴリズムの実装

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) 
} 
} 

もっと慣用的にこれを行う方法はありますか?

+0

気にしないでください。私はそれを考え出した。私が必要としたのは折り畳みだった。なぜ私は最初にそれが起こらなかったのか分かりません。 –

+1

あなたのソリューションを投稿できますか? – Christian

+0

誰かがここにScalaソリューションを書いています:http://rosettacode.org/wiki/Hofstadter-Conway_%2410000_sequence – axel22

答えて

2

私はこれを以前に投稿しようとしていましたが、私は8時間以内に自分の質問への回答を投稿するのに十分な信用を持っていないので、私は待たなければなりませんでした。 @ axel22が指摘したように、これは昨夜ロゼッタコードウェブサイトに投稿した解決策の一部でした。

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の明白な選択を使用して解決策を考え出すしようとして捕まってしまったいくつかの理由でした。

関連する問題