簡體   English   中英

使Haskell List Recursion函數更有效

[英]Make Haskell List Recursion function more efficient

我編寫了一個函數,該函數將比較兩個列表,並檢查第一個列表是否是第二個列表的前綴,並且必須使用遞歸來完成。

例如:

prefix [1,2] [1,2,3]
>True
prefix [2,1,4] [2,1,13,4]
>False

現在,我已經完成了,但是我覺得效率很低:

prefix :: [Int] -> [Int] -> Bool
prefix (x:xs) (y:ys)
|   null xs                         =   True
|   x == y && head xs == head ys    =   True && prefix xs ys
|   head xs /= head ys              =   False

我希望它可以更有效地進行,並具有更好的模式匹配。 是真的嗎?

您根本不需要使用head函數。 這使比較的數量增加了一倍。 嘗試這個:

prefix :: [Int] -> [Int] -> Bool
prefix [] _ = True
prefix _ [] = False
prefix (x:xs) (y:ys)
  | x == y = prefix xs ys
  | otherwise = False

乍得·吉爾伯特的解決方案可以非常簡化:

prefix :: [Int] -> [Int] -> Bool
prefix [] _ = True
prefix (x:xs) (y:ys)
  | x == y = prefix xs ys
prefix _ _ = False

這不會影響性能,但是會展示一種語言功能:當某個模式上的所有防護措施均失敗時,該匹配將被放棄,並且匹配將在下一個模式下恢復。

 Prelude > let prefix [] _ = True
 Prelude |     prefix _ [] = False
 Prelude |     prefix (x:xs) (y:ys) = if ( x==y) then prefix xs ys else False

例子:

  Prelude> prefix [1,3] []
  False
  Prelude> prefix [] [1,2,3]
  True
  Prelude> prefix [1,2] [1,2,3]
  True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM