如何在Elixir中实现double for循环?如何在Elixir中实现双循环?
我有兴趣编写一个double for循环来比较一个naiveSort和一个quickSort实现。
然后我意识到我甚至不知道如何在elixir中编写一个double for循环!
那么,如何在Elixir中编写一个double for循环?请记住,我试图做一个naiveSort ...
如何在Elixir中实现double for循环?如何在Elixir中实现双循环?
我有兴趣编写一个double for循环来比较一个naiveSort和一个quickSort实现。
然后我意识到我甚至不知道如何在elixir中编写一个double for循环!
那么,如何在Elixir中编写一个double for循环?请记住,我试图做一个naiveSort ...
一个惯用的方式做这样可能会使用列表理解:
defmodule Quick do
def sort([first | rest]) do
sort(for(n <- rest, n < first, do: n)) ++
[first] ++
sort(for(n <- rest, n >= first, do: n))
end
def sort([]) do
[]
end
end
iex(5)> Quick.sort [5,4,3,2,1]
[1, 2, 3, 4, 5]
当然,快速排序使其本身相当不错,以递归解决方案,因为该算法是“排序所有比我小的项目,然后添加我,然后添加比我大的所有项目”。这在Elixir(和Erlang)中表现得非常接近。
for
是一个列表理解。它建立了一个基于生成器的列表(n <- rest
部分和一个过滤器(n < first
部分)。
似乎你的quicksort实现会遍历数组中的每个元素两次,这是不必要的。创建2个单独的列表? –
也快速排序在lis中间随机选择一个元素t,在灵丹如何做到这一点? –
递归用于erlang/elixir而不是循环。在Elixir的Enum模块或:lists模块中有很多例子erlang –
我把这个作为评论,因为我不知道答案,但是这给了我今天早上的观点,我正在学习Elixir在工作中的一个项目,我发现在范式刷新方面的巨大转变。 http://elixir-lang.org/getting-started/recursion.html – jaydel
或者你也许可以使用理解 – JustMichael