2015-06-02 10 views
11

Tôi đã lén lút với Elixir trong vài tuần qua. Tôi vừa mới xem qua số combinations algorithm in Erlang ngắn gọn này, mà tôi đã thử viết lại ở Elixir nhưng bị kẹt.Làm thế nào để viết lại thuật toán kết hợp Erlang trong Elixir?

Erlang phiên bản:

comb(0,_) -> 
    [[]]; 
comb(_,[]) -> 
    []; 
comb(N,[H|T]) -> 
    [[H|L] || L <- comb(N-1,T)]++comb(N,T). 

phiên bản Elixir tôi đã đưa ra với điều này, nhưng nó không phải là chính xác:

def combination(0, _), do: [[]] 
def combination(_, []), do: [] 
def combination(n, [x|xs]) do 
    for y <- combination(n - 1, xs), do: [x|y] ++ combination(n, xs) 
end 

Ví dụ sử dụng, với kết quả không chính xác:

iex> combination(2, [1,2,3]) 
[[1, 2, [3], [2, 3]]] 

Bất kỳ con trỏ về những gì tôi đang làm sai?

Cảm ơn!
Sean

Trả lời

13

Bạn cần bọc biểu thức trong dấu ngoặc đơn như mã Erlang.

def combination(n, [x|xs]) do 
    (for y <- combination(n - 1, xs), do: [x|y]) ++ combination(n, xs) 
end 

Demo:

iex(1)> defmodule Foo do 
...(1)> def combination(0, _), do: [[]] 
...(1)> def combination(_, []), do: [] 
...(1)> def combination(n, [x|xs]) do 
...(1)>  (for y <- combination(n - 1, xs), do: [x|y]) ++ combination(n, xs) 
...(1)> end 
...(1)> end 
{:module, Foo, 
<<70, 79, 82, 49, 0, 0, 6, 100, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 137, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 2, 104, 2, ...>>, 
{:combination, 2}} 
iex(2)> Foo.combination 2, [1, 2, 3] 
[[1, 2], [1, 3], [2, 3]] 
+0

Tuyệt vời! Cảm ơn bạn. :) – seanomlor

Các vấn đề liên quan