2014-01-10 17 views
3

我具有使用顯式遞歸以下的Haskell函數:與相關值中刪除從功能明確的遞歸

f :: [a] -> [a] 
f (a:b:xs) = g a b : f (g a b : xs) 
    where 
    g :: a -> a -> a 
f (_:[]) = [] 
f []  = [] 

注意,遞歸調用取決於之前的步驟中計算出的值(由g)。

有沒有辦法去除顯式遞歸,如果是的話,怎麼辦?

+0

什麼是基本情況? –

+0

請參閱我的編輯。我想我加了他們。 –

回答

12

你的功能是精確地發出中間值的摺疊。在Haskell中,這被稱爲scan。具體而言,scanl1相當於您的f,第一個元素除外。

f = drop 1 . scanl1 g 
+0

我需要'tail',因爲否則它就是'f(a:b:xs)= a:g a b:f(g a b:xs)',對吧? –

+0

這對於空列表來說不太合適。 –

+0

Sven,類似的東西。 scanl1在不應用g的情況下輸出第一個raw元素,而你的f跳過它。 Ganesh,我會解決這個問題。忘記尾巴不能在空列表上工作。 –

-3

使用尾遞歸,GHC可以optimaze它

f (a:b:xs) acc = f (g a b : xs) (g a b : acc) 
f _ acc = reverse acc 

並調用所以

f myList []