2016-09-07 116 views
-2

我試圖解決this從本文給出了一點問題:入門數組/列表元素索引

-module(two_sum). 

-export([main/2]). 

-spec main(List :: list(), Target :: non_neg_integer()) -> list(). 

%%%================================================================== 
%%% Export 
%%%================================================================== 
main(List, Target) -> 
    P = [{string:str(List, [X]), string:str(List, [Y]), X + Y} || X <- List, Y <- List, Y > X andalso X + Y =:= Target], 
    io:format("Result: ~w~n", [P]). 
%%[X + Y || X <- List, Y <- List, Y > X]. 
%%iterate(List, Target, 0, {}). 

%%%================================================================== 
%%% Internal 
%%%================================================================== 
iterate([], _Target, _Sum, _Result) -> {}; 
iterate([H | T], Target, Sum, Result) -> 
    %%io:format("H >> ~w; T >> ~w, Target >> ~w~n", [H, T, Target]). 
    Acc = Sum + H, 
    case Acc =:= Target of 
    true -> erlang:append_element(Result, H); 
    false -> iterate(T, Target, Acc, Result) 
    end. 

我的問題是:

  1. 有沒有更有效的方法來從獲取元素的索引數組列表?目前我使用的是:{string:str(List, [X]),但我不確定這是否正確,儘管它完成了工作。
  2. 例如,如果我碰巧得到這樣的結果:R = [{1,2,9},{1,3,13},{1,4,17},{2,3,18},{2,4,22},{3,4,26}],我該如何模式匹配{1,2,9},知道9Target?我試過[{X1, X2, Target}] = R ......但它不喜歡它!
+2

如果您所描述的「問題說明」中的問題,並在語言無關的僞代碼解釋你的算法,然後有一個更好的機會,你要得到迴應(假設你的問題是關於算法而不是特定的語言特性)。 –

+0

我不明白你的問題。更有效的方式是什麼?順便說一句,我認爲你的算法實際上並沒有正常工作。 –

回答

1

這個怎麼樣。對於每個元素,檢查其與列表中每個後續元素的總和,攜帶兩個索引,用於向用戶報告是否找到匹配項。

find_indices(Target, [_H | T] = L) -> 
    find_indices(Target, L, T, 0, 1). 


find_indices(_Target, [_], [], _I, _J) -> 
    io:format("No match~n"); 

find_indices(Target, [_Curr | LeftRest], [], I, _J) -> 
    find_indices(Target, LeftRest, tl(LeftRest), I + 1, I + 2); 

find_indices(Target, [Curr | _LeftRest], [Other | _RightRest], I, J) 
    when Target =:= Curr + Other -> 
    io:format("Match at indices ~p and ~p: ~p + ~p = ~p~n", 
    [I, J, Curr, Other, Target]), 
    ok; 

find_indices(Target, L, [_Other | RightRest], I, J) -> 
    find_indices(Target, L, RightRest, I, J + 1). 

例子:

1> index:find_indices(7, [1,2,3,4,5,6]). 
Match at indices 2 and 3: 3 + 4 = 7 
ok 
2> index:find_indices(11, [1,2,3,4,5,6]). 
Match at indices 4 and 5: 5 + 6 = 11 
ok 
3> index:find_indices(12, [1,2,3,4,5,6]). 
No match 
ok 
4> index:find_indices(4, [1,2,3,4,5,6]). 
Match at indices 0 and 2: 1 + 3 = 4 
ok