从函数结果生成无限列表

时间:2016-12-18 06:37:15

标签: algorithm haskell memoization

我有一个带整数的函数并返回一个整数列表。

如何有效地将此函数映射到初始整数,然后对于先前未映射的结果列表的每个项目,应用相同的函数并基本上生成无限列表。

E.g。

f :: Int -> [Int]
f 0 = [1,2]++(f 1)++(f 2)

此外,我需要能够将结果列表索引到10E10。如何优化?记忆化?

1 个答案:

答案 0 :(得分:1)

您需要广度优先搜索。基本习语是这样的:

bfs :: (a -> [a]) -> [a] -> [a]
bfs f xs = xs ++ bfs f (concatMap f xs)

请注意我们如何保持现状"状态"在参数xs中,输出它,然后递归调用一个新的状态,f应用于输入状态的每个元素。

如果您想过滤掉之前未见过的元素,您还需要传递一些额外的状态,以便跟踪您已经看过的元素,例如: a Data.Set,并相应地调整算法。我会把这一点留给你,因为我是一个恼人的教育者。