Я снова сталкиваюсь с проблемами Project Euler (делали первые 23 перед тем, как учил С#), и я совершенно сбив с толку на подпункт производительности моего решения проблемы 5.
Он читается следующим образом:
2520 - наименьшее число, которое можно разделить на каждый из чисел от 1 до 10 без остатка.
Какое наименьшее положительное число, которое равномерно делится на все чисел от 1 до 20?
Теперь мое невероятно примитивное грубое решение С# перехватывает эту проблему примерно через 25 секунд.
var numbers = Enumerable.Range(1, 20);
int start = 1;
int result;
while (true)
{
if (numbers.All(n => start % n == 0))
{
result = start;
break;
}
start++;
}
Теперь мое решение F # также использует грубое форсирование, но, по крайней мере, оно делает немного больше дискриминации и поэтому так, что оно "должно" в моем сознании работать быстрее, но оно срабатывает через ~ 45 секунд, поэтому оно почти в два раза медленнее, чем С# 1.
let p5BruteForce =
let divisors = List.toSeq ([3..20] |> List.rev)
let isDivOneToTwenty n =
let dividesBy =
divisors |> Seq.takeWhile(fun x -> n % x = 0)
Seq.length dividesBy = Seq.length divisors
let findNum n =
let rec loop n =
match isDivOneToTwenty n with
| true -> n
| false -> loop (n + 2)
loop n
findNum 2520
P.S - Я знаю, что мое решение может быть лучше, в этом случае мне просто интересно, как могло бы быть, что лучшее решение грубой силы может быть настолько медленнее, чем примитивное.