2014-11-25 96 views
0

,所以我有以下的樹狀數據結構:找到產生一個正樹產量最大的功能

data Tree = Node (Int -> Int) Int [Tree] 

基本上,每個節點都包括一個標籤功能(Int -> Int),標籤Int和的子樹列表。現在我想寫一個函數,當給定一個Tree和一個Int時,找到能夠用給定輸入產生最大輸出的函數。

我能找到最大的輸出,如果我應用該功能,但我似乎無法找到相關的功能。

tmax :: Int -> Tree -> Int 
tmax l (Node func _ []) = func l 
tmax l (Node func _ xs) = max (func l) $ maximum $ map (tmax l) xs 

這給了我應用於l時可以由任何函數產生的最大輸出。

的預期功能的一些例子:

t2 = Node (+1) 1 [Node (+5) 2 [], Node (-3) 7 [], Node (\x -> x*x) 4 []] 

      (+1) 1 
    /-------|-------\ 
    (+5) 2 (-3) 7 (\x -> x*x) 4 

所以,如果我申請tmax 4 t2,答案是(\x -> x*x),因爲這會帶來最大的產出。如果我執行tmax 2 t2,則輸出將是(+5),因爲那樣會產生最大的輸出。然而,我目前的功能只會提供最大的價值,但不是功能。因此,對於第一個例子,它將提供16,第二個7.

謝謝!

+0

目前尚不清楚您打算如何使用此數據結構以及您想要的結果。請提供更多信息。 – leftaroundabout 2014-11-25 10:42:35

+0

增加了一個應該如何工作的例子。 – pgrosslicht 2014-11-25 10:51:51

回答

1

嗯,我能夠通過編寫我自己的maximummax實現它,因此他們返回的是函數而不是值。然後一切正常,謝謝!

+1

非常好!現在你知道它應該如何工作了,現在該查看'Data.List.maximumBy' – 2014-11-26 10:52:11

1

這是一個提示。先寫一個二進制最大值。

bmax :: Int -> Tree -> Tree -> Tree 
bmax l [email protected](Node f1 _ _) [email protected](Node f2 _ _) | f1 l > f2 l = t1 
             | otherwise = t2 

然後,使用遞歸計算所有子樹的最大值。您可以對子樹列表使用摺疊。