如何在elixir中检查数组是否按顺序和连续顺序排列
我想知道是否有办法确定数组是否按顺序排列且连续。例如
arr=[1,2,3,4,5]
Arr 将返回 true,因为它是连续的
arr2=[1,2,3,4,56]
这将返回 false,因为 56 不会在 4 之后立即出现。我尝试了很多方法,但很难,因为没有循环
回答
当助手不像普通的好裸递归那样简单时就是这种情况。此外,这是一个很好的练习,因为如果没有清楚地了解如何处理递归带来的问题,就不能做长生不老药。
defmodule Checkers do
def seq?(input), do: do_seq?(input, nil)
defp do_seq?([], _), do: true # we are done
defp do_seq?([h | t], nil),
do: do_seq?(t, h) # entry
defp do_seq?([h | t], ah) when ah == h - 1,
do: do_seq?(t, h) # success path
defp do_seq?(_, _), do: false # ouch! we failed
end
Checkers.seq?([1, 2, 3, 4])
#? true
Checkers.seq?([1, 3, 3, 4])
#? false
绝对正确的Enum.reduce_while/3,所建议@宁静,詹姆斯基本上不正是这个引擎盖下。此解决方案的更简洁版本是
Enum.reduce_while(arr, true, fn
curr, prev when prev == true or curr == prev + 1 ->
{:cont, curr}
_curr, _prev ->
{:halt, false}
end) # returns truthy value if seq