Visual Studio 2012では、なぜこのコードはインタラクティブモードで非常に高速に実行され、コンソールアプリケーションとして実行すると非常に低速で実行されるのでしょうか。私は高速のコンピューターを持っていますが、実行時に関数が完了する前に4まで数えることができ、インタラクティブスタジオウィンドウでは1まで数えることはできません。
これについて私を苛立たせている他の部分は、私が他の人のProject Euler#4のF#コードをテストすると、それらはすべて正常に実行されるということです。したがって、このコードには最適ではない何かがあると私は信じています。(そしてそれもとてもきれいできれいでした>:P)
let reverse(digits:string) =
digits.ToCharArray() |> Array.rev |> System.String.Concat
let isPalindrome(number:int) =
let text = number.ToString()
if text.Length % 2 = 0 then
text = reverse(text)
else
false
let palindromes(floor:int, ceiling:int) =
seq {
for i1 = floor to ceiling do
for i2 = floor to ceiling do
let result = i1 * i2
if isPalindrome result then
yield result
}
let run =
palindromes(100, 999)
|> Seq.max
まとめ
後世のために、最も効果的なパフォーマンスの変更をリストします。
- Concatを削除し、代わりに新しい文字列を作成します。
- それらすべてを収集するのではなく、最大の回文のみを保持する
- 文字列バージョンのreverseを計算リバースに置き換える
それはまだ私の元の問題を説明していません。しかし、今ではごくわずかであり、これ以上時間を費やすように自分を納得させるのは難しいです。皆様のご意見に感謝いたします。ありがとう!