F# で Project Euler Problem 7
素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり, 6番目の素数は 13 である.
10 001 番目の素数を求めよ.
What is the 10 001st prime number?
Scala版をそのまま移植
> exception WhileBreak of unit;; exception WhileBreak of unit > let mutable prime_list = [2];; val mutable prime_list : int list = [2] > let mutable cnt = 1;; val mutable cnt : int = 1 > let mutable num = 3;; val mutable num : int = 3 > - while (cnt < 10001) do - let num_sqrt = sqrt (float num) - let mutable fPrime = true - try - prime_list - |> List.iter (fun p -> - if ((float p) > num_sqrt) then - raise (WhileBreak ()) - elif (num % p = 0) then - fPrime <- false - raise (WhileBreak ()) - ) - with _ -> () - - if fPrime then - prime_list <- List.append prime_list [num] - cnt <- cnt + 1 - num <- num + 2 - ;; |> List.iter (fun p -> ----------------------^ stdin(11,23): error FS0407: The mutable variable 'fPrime' is used in an invalid way. Mutable variables cannot be captured by closures. Consider eliminating this use of mutation or using a heap-allocated mutable reference cell via 'ref' and '!'.
クロージャになっちゃってるのか?
> exception WhileBreak of unit;; exception WhileBreak of unit > let mutable prime_list = [2];; val mutable prime_list : int list = [2] > let mutable cnt = 1;; val mutable cnt : int = 1 > let mutable num = 3;; val mutable num : int = 3 > let mutable fPrime = true;; val mutable fPrime : bool = true > - while (cnt < 10001) do - let num_sqrt = sqrt (float num) - fPrime <- true - try - prime_list - |> List.iter (fun p -> - if ((float p) > num_sqrt) then - raise (WhileBreak ()) - elif (num % p = 0) then - fPrime <- false - raise (WhileBreak ()) - ) - with _ -> () - - if fPrime then - prime_list <- List.append prime_list [num] - cnt <- cnt + 1 - num <- num + 2 - ;; val it : unit = () > prime_list.[prime_list.Length-1];; val it : int = 104743 > ;;
Scala版 より高速!