2016-04-26 102 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,如果編寫多語句函數需要太多工作,將是最後的手段。

回到你的問題,第一個是三個中最好的。

相關問題