Основная проблема в вашем коде заключается в том, что вы используете @
для объединения двух списков.Составление двух списков стоит линейное время, а не постоянное время.
Постоянный способ - добавить новое простое число в начало списка с помощью оператора ::
, как показано ниже:
let primeFactors x =
let rec fact x div list =
if x % div = 0 then
fact (x/div) div (div::list)
elif div > int(sqrt (float x)) then
if x > 1 then x::list
else list
else
fact x (div+1) list
fact x 2 []
Также let
значения привязки обычно следуют за camleStyleименования конверсий.