2016-04-26 90 views
2

我目前正在学习灵丹妙药,我想知道这三个实施是否真的是一个选择的问题,或者有一些与绩效或其他事情有关的最佳实践,换句话说是否有最好的实践?这些不同的函数定义有哪些优缺点?

我的第一个实现是第三个(我知道),但是如果我不得不选择,我会首先选择第二个。第一个看起来很奇怪,因为我定义了3次函数

Thx!

@spec count(list) :: non_neg_integer 
    def count(l), do: count(l, 0) 
    defp count([], acc), do: acc 
    defp count([_ | tail], acc), do: count(tail, acc + 1) 


    @spec count(list) :: non_neg_integer 
    def count(l) do 
     case l do 
      [] -> 0 
      [_|tail] -> 1 + count(tail) 
     end 
    end 


@spec count(list) :: non_neg_integer 
    def count(l) do 
     do_count(l, counter) 
    end 

    defp do_count(list, counter \\ 0) do 
     cond do 
      list == [] -> counter 
      true -> 
       counter = counter + 1 
       do_count(tl(list), counter) 
     end 
    end 
+0

我非常想改变你的问题的标题,但似乎它可能是编辑超越。请让你的问题的题目更具描述性。 –

+0

够公平了......你能给我你想用的标题吗? – BenNG

+0

想到的一点是“多功能头是否能更好地解决这个问题?”你现有的标题只是非常通用的。 –

回答

8

我在想,如果这三种实现是真正选择的问题或有相关业绩或其他一些事情的最佳实践,换句话说就是有一个最好的?

它们之间的一个重要区别是第一个和第三个实现是tail recursive,而第二个实现不是。这意味着第二个实现将使用O(n)内存在元素列表n上执行,而第一个和第三个将使用O(1)

第三种解决方案使用cond,其中模式匹配解决方案会更短,而且可能更快。

可以重写

cond do 
    list == [] -> counter 
    true -> 
    counter = counter + 1 
    do_count(tl(list), counter) 
end 

case list do 
    [] -> counter 
    [_|tail] -> 
    counter = counter + 1 
    do_count(tail, counter) 
end 

这几乎是一样的先执行。

第一个肯定是三种中最习惯和最可能最快的。

0

您可以随时将多分句功能翻译为case语句,反之亦然。请注意,Elixir是一种功能性编程语言,因此编写多语句函数非常方便。

至于cond,如果编写多语句函数需要太多工作,将是最后的手段。

回到你的问题,第一个是三个中最好的。

相关问题