如何定义 listTree 使其在线性时间内运行?
How to define listTree so that it runs in linear time?
listTree' :: Tree a -> [a]
listTree' t = foldTree f z t []
where
f = undefined
z [] = []
需要帮助解决 f。当我插入 f a b c = a ++ [b] ++ c
时出现错误
data Tree a
= Tip
| Bin (Tree a) a (Tree a)
deriving (Show, Eq)
foldTree :: (b -> a -> b -> b) -> b -> Tree a -> b
foldTree f z Tip = z
foldTree f z (Bin l x r) = f (foldTree f z l) x (foldTree f z r)
这里是 foldTree 和树的数据类型
为了实现线性时间,你应该让 foldTree f z t
return 一个接受列表的函数并且 return 是一个列表。
这意味着对于 z
一个叶子,我们只是 return 给定的列表,因此我们不添加任何值。对于 f
我们将获取列表,用右子树调用它,然后在该列表前面加上那个 Bin
节点的值,最后用左子树调用它,所以:
listTree' :: Tree a -> [a]
listTree' t = foldTree f id t []
where <strong>f x y z ls = x (y: z ls)</strong>
这里ls
就是我们要处理的列表,z
是一个函数,把右子树的items放在ls
前面,y
是存储在该节点中的值,x
是一个将左子树的项目添加到列表中的函数。
我们可以定义f
,如如f x y z = x . (y:) . z
。因此,我们首先应用为右子树生成的函数,然后在列表前添加 y
,然后通过左子树的函数 运行。
listTree' :: Tree a -> [a]
listTree' t = foldTree f z t []
where
f = undefined
z [] = []
需要帮助解决 f。当我插入 f a b c = a ++ [b] ++ c
时出现错误
data Tree a
= Tip
| Bin (Tree a) a (Tree a)
deriving (Show, Eq)
foldTree :: (b -> a -> b -> b) -> b -> Tree a -> b
foldTree f z Tip = z
foldTree f z (Bin l x r) = f (foldTree f z l) x (foldTree f z r)
这里是 foldTree 和树的数据类型
为了实现线性时间,你应该让 foldTree f z t
return 一个接受列表的函数并且 return 是一个列表。
这意味着对于 z
一个叶子,我们只是 return 给定的列表,因此我们不添加任何值。对于 f
我们将获取列表,用右子树调用它,然后在该列表前面加上那个 Bin
节点的值,最后用左子树调用它,所以:
listTree' :: Tree a -> [a]
listTree' t = foldTree f id t []
where <strong>f x y z ls = x (y: z ls)</strong>
这里ls
就是我们要处理的列表,z
是一个函数,把右子树的items放在ls
前面,y
是存储在该节点中的值,x
是一个将左子树的项目添加到列表中的函数。
我们可以定义f
,如f x y z = x . (y:) . z
。因此,我们首先应用为右子树生成的函数,然后在列表前添加 y
,然后通过左子树的函数 运行。