2016-08-23 52 views
1

如何在Elixir中实现double for循环?如何在Elixir中实现双循环?

我有兴趣编写一个double for循环来比较一个naiveSort和一个quickSort实现。

然后我意识到我甚至不知道如何在elixir中编写一个double for循环!

那么,如何在Elixir中编写一个double for循环?请记住,我试图做一个naiveSort ...

+0

递归用于erlang/elixir而不是循环。在Elixir的Enum模块或:lists模块中有很多例子erlang –

+0

我把这个作为评论,因为我不知道答案,但是这给了我今天早上的观点,我正在学习Elixir在工作中的一个项目,我发现在范式刷新方面的巨大转变。 http://elixir-lang.org/getting-started/recursion.html – jaydel

+1

或者你也许可以使用理解 – JustMichael

回答

2

一个惯用的方式做这样可能会使用列表理解:

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部分)。

+0

似乎你的quicksort实现会遍历数组中的每个元素两次,这是不必要的。创建2个单独的列表? –

+0

也快速排序在lis中间随机选择一个元素t,在灵丹如何做到这一点? –