我正在嘗試使用fermats method創建素數分解器。不允許在Guard中使用函數。建議備用實施要
此行生成錯誤
find_factors(A, B, FactorThis) when is_a_square(B) == true ->
調用本地/進口功能is_a_square/1是後衛非法
唯一可能替代我看到這個實現是使用某種該函數內的case語句。我避免了這一點,因爲它可能會搞砸尾遞歸。我是Erlang noob。 還有什麼其他的方式來實現這個功能?
get_int_part_of_sqrt(N) ->
trunc(math:sqrt(N)).
is_a_square(N) ->
get_int_part_of_sqrt(N) * get_int_part_of_sqrt(N) == N.
calculate_new_b(A, FactorThis) ->
NewB = trunc(abs((A * A) - FactorThis)),
io:format("Calculate_new_b A^2 ~w- FT ~w= NB ~w ~n",[A*A,FactorThis,NewB]),
find_factors(A, B, FactorThis) when is_a_square(B) == true ->
io:format("find_factors true ~w ~w~n", [A, B]),
{ok, A + get_int_part_of_sqrt(B), A - get_int_part_of_sqrt(B)};
find_factors(A, B, FactorThis) ->
io:format("find_factors false ~w ~w~n", [A, B]),
NewA = A + 1,
NewB = calculate_new_b(NewA, FactorThis),
find_factors(NewA, NewB, FactorThis).
編輯。 調用calculate_new_b中的固定參數
添加缺少get_int_part_of_sqrts。
是的。這就是我想到的。我從有問題的代碼中刪除了垃圾。這是評論殘留,不正確地刪除。謝謝。 – EvilTeach
不幸的是,許多允許用戶在警衛中定義功能的支持者錯過了這一觀點,或者提出了這樣的改變以使其「安全」,從而徹底改變了部分語言。 – rvirding
我必須重新閱讀討論。我對Haskell背景的直覺是不同意的,並且建議應該有方法將一個函數標記爲無副作用(從Haskeller的角度來看,甚至一些批准的函數,比如'node/0'和'self/0'不是),但這看起來並不合適。 – Dan