从函数结果生成无限列表
Generate infinite list from function results
我有一个接受整数和 returns 整数列表的函数。
我如何有效地将此函数映射到一个初始整数,然后对于之前未映射的结果列表中的每个项目,应用相同的函数并实质上生成一个无限列表。
例如
f :: Int -> [Int]
f 0 = [1,2]++(f 1)++(f 2)
此外,我需要能够将结果列表索引到 10E10。这将如何优化?记忆化?
您需要广度优先搜索。基本习语是这样的:
bfs :: (a -> [a]) -> [a] -> [a]
bfs f xs = xs ++ bfs f (concatMap f xs)
注意我们如何将当前 "state" 保留在参数 xs
中,将其输出,然后递归调用新状态 f
应用于输入状态的每个元素.
如果你想过滤掉你以前没有见过的元素,你还需要传递一些额外的状态来跟踪你见过的元素,例如a Data.Set
,并相应地调整算法。我会把那一点留给你,因为我是一个令人讨厌的教师。
我有一个接受整数和 returns 整数列表的函数。
我如何有效地将此函数映射到一个初始整数,然后对于之前未映射的结果列表中的每个项目,应用相同的函数并实质上生成一个无限列表。
例如
f :: Int -> [Int]
f 0 = [1,2]++(f 1)++(f 2)
此外,我需要能够将结果列表索引到 10E10。这将如何优化?记忆化?
您需要广度优先搜索。基本习语是这样的:
bfs :: (a -> [a]) -> [a] -> [a]
bfs f xs = xs ++ bfs f (concatMap f xs)
注意我们如何将当前 "state" 保留在参数 xs
中,将其输出,然后递归调用新状态 f
应用于输入状态的每个元素.
如果你想过滤掉你以前没有见过的元素,你还需要传递一些额外的状态来跟踪你见过的元素,例如a Data.Set
,并相应地调整算法。我会把那一点留给你,因为我是一个令人讨厌的教师。