Function 因式分解数(Erlang)

Function 因式分解数(Erlang),function,recursion,erlang,Function,Recursion,Erlang,我希望在Erlang中基于头递归或中间递归对数字进行因式分解。该函数称为fact,并接受1个参数fact/1。结果将返回作为数字因子的数字列表 24返回以下内容:[1,2,3,4,6,8,12,24] 有人知道我该怎么做吗?类似的事情 -module(fact). -export([fact_rec/1]). fact_rec(N) -> fact_rec(N, 1, []). fact_rec(N, I, Acc) when I =< trunc(N/2) ->

我希望在Erlang中基于头递归或中间递归对数字进行因式分解。该函数称为fact,并接受1个参数fact/1。结果将返回作为数字因子的数字列表

24返回以下内容:[1,2,3,4,6,8,12,24]

有人知道我该怎么做吗?

类似的事情

-module(fact).
-export([fact_rec/1]).

fact_rec(N) ->
    fact_rec(N, 1, []).

fact_rec(N, I, Acc) when I =< trunc(N/2) ->
    case N rem I of
        0 -> fact_rec(N, I+1, [I | Acc]);
        _ -> fact_rec(N, I+1, Acc)
    end;
fact_rec(N, _I, Acc) -> lists:reverse(Acc) ++ [N].
-模块(事实)。
-导出([事实记录/1])。
事实记录(N)->
事实记录(N,1,[])。
当I=
第一类对物损害案件
0->事实记录(N,I+1[I|Acc]);
_->事实记录(N,I+1,Acc)
终止
事实记录(N,I,Acc)->列表:反向(Acc)+[N]。

使用列表理解

fact_comp(N) ->
    if N > 0  ->
         [ V || V <- lists:seq(1, N div 2), N rem V =:= 0 ] ++ [ N ];
       N < 0 -> 
         Na = 0 - N,
         [ V || V <- lists:seq(1, Na div 2), Na rem V =:= 0 ] ++ [ Na ];
       N =:= 0 -> []
    end.
fact\u comp(N)->
如果N>0->
[V | | V
Na=0-N,
[V | | V[]
终止

我向您提出了这个解决方案。我首先搜索素因子中的分解,然后构建因子列表。我认为平均而言,它应该更有效

divlist(N) -> automult([1|decomp(N)]).

decomp(N) when is_integer(N), (N > 0) -> 
    lists:reverse(decomp(N,[],2)).

decomp(N,R,I) when I*I > N -> [N|R];
decomp(N,R,I) when (N rem I) =:= 0 -> decomp(N div I,[I|R],I);
decomp(N,R,2) -> decomp(N,R,3);
decomp(N,R,I) -> decomp(N,R,I+2).

automult(L=[H]) when is_number(H)-> L;
automult([H|Q]) when is_number(H)->
    L1 = automult(Q),
    L2 = [H*X || X <- L1],
    lists:usort([H|L1]++L2).
divlist(N)->automult([1 | decomp(N)]。
当为_整数(N),(N>0)->
列表:反向(反编译(N,[],2))。
当I*I>N->[N | R]时反编译(N,R,I);
当(nremi)=0->decomp(N divi[I | R],I)时的decomp(N,R,I);
decomp(N,R,2)->decomp(N,R,3);
decomp(N,R,I)->decomp(N,R,I+2)。
当_数(H)->L时,automult(L=[H]);
automult([H|Q])何时为_编号(H)->
L1=自动倍增(Q),
L2=[H*X | | X
随机:种子(erlang:now()),
L=[random:uniform(Max)| | | | |{X,divlist(X)}| | X{X,fact | rec(X)}| X automult([1 | decomp(N)])。
当为_整数(N),(N>0)->
列表:反向(反编译(N,[],2))。
当I*I>N->[N | R]时反编译(N,R,I);
当(nremi)=0->decomp(N divi[I | R],I)时的decomp(N,R,I);
decomp(N,R,2)->decomp(N,R,3);
decomp(N,R,I)->decomp(N,R,I+2)。
当_数(H)->L时,automult(L=[H]);
automult([H|Q])何时为_编号(H)->
L1=自动倍增(Q),
L2=[H*X | | X
如果N>0->
[V | | V
Na=0-N,
[V | | V[]
终止
%方法3
事实记录(N)->
事实记录(N,1,[])。
当I=
第一类对物损害案件
0->事实记录(N,I+1[I|Acc]);
_->事实记录(N,I+1,Acc)
终止
事实记录(N,I,Acc)->列表:反向(Acc)+[N]。

您对实施没有任何想法吗?
-module (test).

-compile((export_all)).


test(Nbtest,Max) ->
    random:seed(erlang:now()),
    L = [random:uniform(Max) || _ <- lists:seq(1,Nbtest)],
    F1 = fun() -> [{X,divlist(X)} || X <- L] end,
    F2 = fun() -> [{X,fact_comp(X)} || X <- L] end,
    F3 = fun() -> [{X,fact_rec(X)} || X <- L] end,
    {T1,R} = timer:tc(F1),
    {T2,R} = timer:tc(F2),
    {T3,R} = timer:tc(F3),
    {T1,T2,T3}.


% Method1
divlist(N) -> automult([1|decomp(N)]).

decomp(N) when is_integer(N), (N > 0) -> 
    lists:reverse(decomp(N,[],2)).

decomp(N,R,I) when I*I > N -> [N|R];
decomp(N,R,I) when (N rem I) =:= 0 -> decomp(N div I,[I|R],I);
decomp(N,R,2) -> decomp(N,R,3);
decomp(N,R,I) -> decomp(N,R,I+2).

automult(L=[H]) when is_number(H)-> L;
automult([H|Q]) when is_number(H)->
    L1 = automult(Q),
    L2 = [H*X || X <- L1],
    lists:usort([H|L1]++L2).

% Method 2
fact_comp(N) ->
    if N > 0  ->
         [ V || V <- lists:seq(1, N div 2), N rem V =:= 0 ] ++ [ N ];
       N < 0 -> 
         Na = 0 - N,
         [ V || V <- lists:seq(1, Na div 2), Na rem V =:= 0 ] ++ [ Na ];
       N =:= 0 -> []
    end.


% Method 3
fact_rec(N) ->
    fact_rec(N, 1, []).

fact_rec(N, I, Acc) when I =< trunc(N/2) ->
    case N rem I of
        0 -> fact_rec(N, I+1, [I | Acc]);
        _ -> fact_rec(N, I+1, Acc)
    end;
fact_rec(N, _I, Acc) -> lists:reverse(Acc) ++ [N].