[Elixir]implement binary search with Elixir

ElixirでBinary Searchを実装してみた。メモ。


defmodule Search do
def binary(_, []), do: -1
def binary(search, [head|tail]) when tail == [], do: if search == head, do: 0, else: -1
def binary(search, list), do: binary search, 0, length(list) – 1, list
defp binary(search, left_len, right_len, list) when right_len – left_len == 1 do
cond do
Enum.at(list, left_len) == search ->
left_len
Enum.at(list, right_len) == search ->
right_len
true ->
-1
end
end
defp binary(search, left_len, right_len, list) do
mid = round((right_len – left_len) / 2)
cond do
Enum.at(list, mid) > search ->
binary search, left_len, mid, list
true ->
binary search, mid, right_len, list
end
end
end
ExUnit.start
defmodule SearchTest do
use ExUnit.Case
test "empty case" do
assert Search.binary(1, []) == -1
end
test "one case" do
assert Search.binary(1, [1]) == 0
assert Search.binary(2, [1]) == -1
end
test "two case" do
assert Search.binary(1, [1, 2]) == 0
assert Search.binary(2, [1, 2]) == 1
assert Search.binary(3, [1, 2]) == -1
end
test "many case" do
assert Search.binary(1, [1, 2, 5]) == 0
assert Search.binary(5, [1, 2, 5]) == 2
assert Search.binary(3, [1, 2, 5]) == -1
end
end

1 Comment

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.