algorithm - 从函数结果生成无限列表

标签 algorithm haskell memoization

我有一个函数,它接受一个整数并返回一个整数列表。

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

例如

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/

相关文章:

python - 当调用递归函数对值进行排序时,它会漏掉一个。我该如何解决?

json - Data.Aeson 编码可选键

haskell - 在 Yesod 中不显示表单标签的标准方法?

java - Java 中使用数组作为 memoization key 的最佳实践

algorithm - 在哪里可以了解敌方游戏算法(如星际争霸/魔兽争霸)?

algorithm - 特定字符串的排列数可被数字整除

algorithm - 具有依赖作业/具有多个所需运行时间的作业的加权间隔调度

haskell - 在 Haskell 中是否有一种自动内存全局多态值的方法?

r - 为什么当我将计算量减半时,我在时间上只得到了微小的改进?

haskell - 调试不需要的严格性?