我有一个函数,它接受一个整数并返回一个整数列表。
我如何有效地将此函数映射到一个初始整数,然后对于之前未映射的结果列表中的每个项目,应用相同的函数并实质上生成一个无限列表。
例如
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)
注意我们如何在参数 xs
中保留当前“状态”,输出它,然后递归调用新状态 f
应用于每个元素输入状态。
如果你想过滤掉你以前没有见过的元素,你还需要传递一些额外的状态来跟踪你见过的元素,例如Data.Set
,并相应地调整算法。我会把那一点留给你,因为我是一个令人讨厌的教师。
关于algorithm - 从函数结果生成无限列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41206074/