如何在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


以上是如何在elixir中检查数组是否按顺序和连续顺序排列的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>