2016-10-21 19 views

回答

0

列表理解有另一種語法:

[expr | x <- xs, ...] 

所以你的情況:

function xs = if length xs' == 3 then sum xs else (length xs' - length xs'') where 
    xs' = [x | x <- xs, mod x 2 == 1] 
    xs'' = [x | x <- xs, mod x 2 == 0] 

但是你可以用函數partition獲得xs'xs''一次:

(xs', xs'') = partition (\x -> mod x 2 == 1) xs 

正如評論中提到的那樣,它不是遞歸的。解決方案的想法是在@ michal-gajda答案:越過列表並收集機率,平均數和總和。在年底作出決定:

function = go 0 0 0 where -- same as function xs = go 0 0 0 xs 
    go odds evens s [] = if odds == 3 then s else odds - evens 
    go odds evens s (x:xs) 
     | odd x = go (odds + 1) evens (s + x) xs 
     | otherwise = go odds (evens + 1) (s + x) xs 
+1

我不相信他的老師會接受這個遞歸解決方案。 – destoryer

+0

@changed如果可能,你可以提供一個替代的遞歸解決方案嗎? –

+0

@ changed,好吧,我同意:)它不遞歸 –

2

你應該使用內部函數go,即遞歸累積三種結果:

  1. 列表中的可能性的數量。
  2. 列表中的平均數。
  3. 列表總和。

然後,當列表是空的,你決定什麼返回:

finalStep (odds, evens, sum) | odds == 3 = sum 
          | otherwise = odds-evens 
相關問題