- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这个问题haskell fold rose tree paths深入研究了将玫瑰树折叠到其路径的代码。我正在试验无限玫瑰树,我发现所提供的解决方案不够懒惰,无法在深度和广度都为无限的无限玫瑰树上工作。
考虑一棵玫瑰树:
data Rose a = Rose a [Rose a] deriving (Show, Functor)
这是一棵有限的玫瑰树:
finiteTree = Rose "root" [
Rose "a" [
Rose "d" [],
Rose "e" []
],
Rose "b" [
Rose "f" []
],
Rose "c" []
]
边缘路径列表的输出应该是:
[["root","a","d"],["root","a","e"],["root","b","f"],["root","c"]]
这是一个在两个维度上都无限大的玫瑰树:
infiniteRoseTree :: [[a]] -> Rose a
infiniteRoseTree ((root:_):breadthGens) = Rose root (infiniteRoseForest breadthGens)
infiniteRoseForest :: [[a]] -> [Rose a]
infiniteRoseForest (breadthGen:breadthGens) = [ Rose x (infiniteRoseForest breadthGens) | x <- breadthGen ]
infiniteTree = infiniteRoseTree depthIndexedBreadths where
depthIndexedBreadths = iterate (map (+1)) [0..]
这棵树看起来像这样(只是摘录,有无限的深度和无限的广度):
0
|
|
[1,2..]
/ \
/ \
/ \
[2,3..] [2,3..]
路径看起来像:
[[0,1,2..]..[0,2,2..]..]
这是我最近的尝试(在 GHCi 上做会导致无限循环,没有流输出):
rosePathsLazy (Rose x []) = [[x]]
rosePathsLazy (Rose x children) =
concat [ map (x:) (rosePathsLazy child) | child <- children ]
rosePathsLazy infiniteTree
另一个答案中提供的解决方案也没有产生任何输出:
foldRose f z (Rose x []) = [f x z]
foldRose f z (Rose x ns) = [f x y | n <- ns, y <- foldRose f z n]
foldRose (:) [] infiniteTree
以上都适用于有限玫瑰树。
我尝试了多种变体,但我无法想出让无限二维玫瑰树的边缘折叠操作变得惰性。我觉得这与无限量的 concat
有关。
因为输出是一个二维列表。我可以同时运行二维 take
和具有深度限制或宽度限制或两者的项目!
感谢任何帮助!
在查看此处的答案并进一步思考之后。我开始意识到这是可展开的,因为生成的列表是不可数无限的。这是因为无限深度和宽度的玫瑰树不是二维数据结构,而是无限维数据结构。每个深度级别都赋予一个额外的维度。换句话说,它有点等同于无限维矩阵,想象一个矩阵,其中每个字段都是另一个矩阵.. ad-infinitum。无限矩阵的基数是 infinity ^ infinity
,它已被证明(我认为)是不可数无限的。这意味着任何无限维数据结构在有用的意义上都不是真正可计算的。
将此应用于玫瑰树,如果我们有无限深度,则路径永远不会枚举超过玫瑰树的最左侧。就是这棵树:
0
|
|
[1,2..]
/ \
/ \
/ \
[2,3..] [2,3..]
会生成如下路径:[[0,1,2..], [0,1,2..], [0,1,2..]..]
,而且我们永远不会超过 [0,1,2..]
。
或者换句话说,如果我们有一个包含无限列表的列表。我们也永远不能计算(枚举)它,因为代码会跳转到无限多的维度。
这也与不可数无限的实数有某种关系。在无限实数的惰性列表中,只会无限产生 0.000..
并且永远不会枚举超过它。
我不确定如何形式化上述解释,但这是我的直觉。 (有关引用,请参阅:https://en.wikipedia.org/wiki/Uncountable_set)很高兴看到有人扩大申请 https://en.wikipedia.org/wiki/Cantor's_diagonal_argument对这个问题。
最佳答案
出于某种原因,dfeuer 删除了他的答案,其中包含一个非常好的见解,但只有一个小的、易于修复的问题。下面我将讨论他的见解,并解决容易解决的问题。
他的见解是,原始代码挂起的原因是因为 concat
的参数列表中的任何元素都不为空并不明显。既然我们可以证明这一点(在 Haskell 之外,用纸和铅笔),我们可以稍微作弊让编译器相信它是这样的。
不幸的是,concat
还不够好:如果您给 concat
一个像 [[1..], foo]
这样的列表,它永远不会从 foo
中提取元素。 universe
包的集合可以在这里提供帮助 diagonal
函数,它确实从所有子列表中提取元素。
这两个见解共同导致以下代码:
import Data.Tree
import Data.Universe.Helpers
paths (Node x []) = [[x]]
paths (Node x children) = map (x:) (p:ps) where
p:ps = diagonal (map paths children)
如果我们定义一个特定的无限树:
infTree x = Node x [infTree (x+i) | i <- [1..]]
我们可以看看它在 ghci 中的表现:
> let v = paths (infTree 0)
> take 5 (head v)
[0,1,2,3,4]
> take 5 (map head v)
[0,0,0,0,0]
看起来不错!当然,正如 ErikR 所观察到的,我们不可能将所有路径都放在此处。但是,给定通过 t
的无限路径的任何有限前缀 p
,在 paths
中存在一个有限索引,其元素以前缀 开头>p
.
关于algorithm - 无限深度和无限广度玫瑰树懒折叠到它的边缘路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33128736/
我有一串数字。我需要检查边缘上的数字是否对称,这意味着它们以 2 为模时具有相同的余数。 我已经编写了一个有效的代码,但我对此感到不安,在一些失败之后我想出了这个代码: int PaliPair(ch
我要删除黑色蒙版和人体图像之间的白色边框 图像输入示例: 厚度为1的图像输出: 厚度为2的图像输出: 我尝试了一些在这里找到的具有模糊和阈值的游戏 我还使用此代码查找和绘制轮廓 thickne
这应该是一个在用户悬停时打开的飞出菜单。 这在 Chrome 中工作得很好,我已经尝试了多种方法(使用 CSS :hover,(mousenter)和(mouseleave ) 问题是 - 使用 Ed
我有一个 Apache 服务器 v2.4.43 为我的网站提供服务,我使用一个简单的 .htpasswd,我使用指令“AuthUserFile ”在 .htaccess 中调用它来进行身份验证。 现在
如何仅使用剪辑路径创建波浪边缘? 波浪应该是这样的图像: 最佳答案 您应该通过波函数及其频率生成此剪辑路径。 我用过 cos()在 PHP 中。您可以找到如下链接: https://repl.it/@
我有这张图: digraph G { 1 [label="car"]; 2 [label="x"]; 3 [label="car"]; 4 [label="y"]; 5 [label="cdr"];
我想强制点仅显示节点之间的垂直或水平边缘。 我在帖子 Family tree layout with Dot/GraphViz 中发现了类似的请求,但我不处理树,所以我希望有一个解决方案,无需插入额外
我已经设法让两个直方图重叠,但如果你仔细观察,条形开始倾斜并且没有完全重叠。 我已经调整了线宽和宽度,并没有改善。 我的目标是让所有的条形排列在彼此的顶部,黑边没有歪斜。 有什么办法解决这个问题 这是
我已经设法让两个直方图重叠,但如果你仔细观察,条形开始倾斜并且没有完全重叠。 我已经调整了线宽和宽度,并没有改善。 我的目标是让所有的条形排列在彼此的顶部,黑边没有歪斜。 有什么办法解决这个问题 这是
我一直在与 latex table 搏斗太久了。我需要一个具有居中标题的表格,以及包含可能环绕的文本的正文单元格。由于环绕要求,我使用 p{xxx} 而不是 l 来指定单元格宽度。这导致的问题是单元格
有没有办法平滑转换(平移和旋转)的 BufferedImage 的锯齿状边缘? 测试图像的放大 View : (请注意,这不是将要使用的实际 BufferedImage,仅用于此处演示)。 已使用双线
我在 my page 有一个旋转木马.我的父元素和子元素的边缘都是 flex 的,但是当您按“下一个”或“上一个”并滑动旋转木马时,子元素在移动时不会保持 flex 。我怎样才能避免这种情况? .ho
我在 .boxwrap 和 .lsmlbox + .rsmlbox 之间的嵌套 div 中添加了不必要的空格,这使得无法将 .smlbox + .rsmlbox 与 .box 对齐我相信这是一个比预期
我正在使用 Apple 的 ARKit 制作 AR 应用程序,我想制作盒子的线框轮廓。代码中描述并显示在图片中的那个在盒子的每个面上绘制斜边。它还隐藏了盒子另一侧的角。 Scene Kit 中有没有办
下图仅包含阈值处理后的黑色和白色像素。我在此图像的顶部绘制了一个灰色的旋转矩形。现在我想计算这个旋转矩形内的黑色像素数,但不包括白色矩形矩形外的黑色像素(即白色矩形内的像素数)。 做到这一点的最佳方法
你们如何处理边际 CSS?我所说的边缘是指需要斜体或粗体的单个单词或短语。只用 声明一个“大胆”的类似乎很愚蠢 Bold { font-weight: bold; } 或者斜体,要么! Italic
好的。我知道有几十个类似的线程。我几乎检查了每一个,但找不到可行的解决方案。我试过负边距、最小高度、最大高度、绝对页脚、正文背景颜色,甚至将溢出:隐藏到页面中的所有主要容器。然后将 clearfix
我网站的一部分使用代码使用倾斜边缘: -webkit-clip-path: 多边形(0% 0%, 100% 0%, 81% 100%, 0% 100%) 这在 Chrome 中运行良好,但不适用于任何
我一直在创建这个网站,并且进展顺利。然后我试着给它添加一个模态,但一切都有点走下坡路。问题是在添加模式后,Chrome 中的图像对齐方式发生了变化。它在 Edge 中运行良好。现在我知道这可能是因为
如果我在 Matlab 中使用 image() 命令制作一个 4 x 4 像素的图像,它会将刻度线居中放置在像素的中间。我希望刻度线以像素的左下角为中心。有什么方法可以做到这一点吗? 最佳答案 您可以
我是一名优秀的程序员,十分优秀!