需要一种以ml计算大数的方法,忽略1和数字。我的方式仅适用于小数字,它主要涉及从最低可能的2个因子开始,并检查它们是否相乘,它们是否等于数字,否则保持循环。这对大数字不起作用,因为它需要太多的递归调用
fun factor n=
let
val f1 = 2
val f2 = 3
fun lp f1 f2 = if f1 *f2 = n then (f1,f2)
else if f2 = (n-1)
then lp (f1+1) 2
else lp f1 (f2+1)
in
(lp f1 f2)
end;
答案 0 :(得分:1)
将数字n
分解的典型方法是从2
循环到sqrt(n)
,每次检查n
是否可被当前循环索引整除。您的实施存在一些问题。首先,(如上面的评论之一所述)如果给出的数字是素数,你将进入无限循环。其次,您正在检查冗余案例。下面给出了获得数字所有因子的函数:
fun factor n =
let val sqrtN = Real.ceil(Math.sqrt (Real.fromInt n))
fun lp(i, factors) =
if i > sqrtN
then factors
else
if Int.mod(n, i) = 0
then lp(i+1, (i, n div i)::factors)
else lp(i+1, factors)
in lp(2, nil) end
这似乎能够处理大量数字,并且具有提供数字的所有因素的额外好处。如果您希望在找到一个解决方案后发生短路,那么您可以将lp(i+1, (i, n div i)::factors)
更改为(i, n div i)
并从lp
中删除第二个参数