我有一个带整数的函数并返回一个整数列表。
如何有效地将此函数映射到初始整数,然后对于先前未映射的结果列表的每个项目,应用相同的函数并基本上生成无限列表。
E.g。
f :: Int -> [Int]
f 0 = [1,2]++(f 1)++(f 2)
此外,我需要能够将结果列表索引到10E10。如何优化?记忆化?
答案 0 :(得分:1)
您需要广度优先搜索。基本习语是这样的:
bfs :: (a -> [a]) -> [a] -> [a]
bfs f xs = xs ++ bfs f (concatMap f xs)
请注意我们如何保持现状"状态"在参数xs
中,输出它,然后递归调用一个新的状态,f
应用于输入状态的每个元素。
如果您想过滤掉之前未见过的元素,您还需要传递一些额外的状态,以便跟踪您已经看过的元素,例如: a Data.Set
,并相应地调整算法。我会把这一点留给你,因为我是一个恼人的教育者。