找到在n树中生成最大输出的函数

时间:2014-11-25 10:30:54

标签: haskell

所以我有以下树状数据结构:

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。

谢谢!

2 个答案:

答案 0 :(得分:1)

这里有一个提示。首先写一个二进制最大值。

bmax :: Int -> Tree -> Tree -> Tree
bmax l t1@(Node f1 _ _) t2@(Node f2 _ _) | f1 l > f2 l = t1
                                         | otherwise   = t2

然后,使用递归计算所有子树的最大值。您可以使用折叠作为子树列表。

答案 1 :(得分:1)

好吧,我能够通过编写自己的maximummax实现来实现它,这样它们就会返回函数而不是值。然后一切正常,谢谢!