如何打印以“结束”结尾的树元素;“愤怒”;在Clojure?
我试图在Clojure中为给定的树结构按预先顺序(根、左、右)打印树元素 下面的代码按预先的顺序打印元素,但我不知道如何应用条件来检查字符串是否以“ire”结尾 我试着用过滤器,什么时候用。有人能帮忙吗如何打印以“结束”结尾的树元素;“愤怒”;在Clojure?,clojure,tree,Clojure,Tree,我试图在Clojure中为给定的树结构按预先顺序(根、左、右)打印树元素 下面的代码按预先的顺序打印元素,但我不知道如何应用条件来检查字符串是否以“ire”结尾 我试着用过滤器,什么时候用。有人能帮忙吗 (defn preorder [tree] (if (nil? (:root tree)) (str nil) (let [v (:root tree) l (:left tree) r (:right tree)] (
(defn preorder [tree]
(if (nil? (:root tree))
(str nil)
(let [v (:root tree)
l (:left tree)
r (:right tree)]
(str v
(str " ")
(str l (str " ") (preorder l))
(str " ")
(str r (str " ")(preorder r))))))
建议:
- 算法:生成遍历树的
值序列。 使用序列库:root
或映射
,将其转换为字符串 或者根据需要过滤节点过滤器
- 数据:对
和:left
使用:right
值,而不是nil
:root
(defn preorder [tree]
(if tree
(let [v (:root tree)
l (:left tree)
r (:right tree)]
(cons v (concat (preorder l) (preorder r))))))
比如说
(preorder {:root 5, :left {:root 10}})
;(5 10)
(filter even? (preorder {:root 5, :left {:root 10}}))
;(10)
当心,如果你的树太深,你会用完堆栈 我找不到你要找的东西。但是
(.endsWith“fire”“ire”)
可以检查fire
是否以ire
结尾。此代码已经在遍历一棵树,我要查找的是如何在代码中应用该条件。此代码:(.endsWith“fire”“ire”)。我尝试执行(.endsWith tree“ire”),但当我将左树和右树传递给该树时,这会引发空指针异常。您能给我们一个树的示例吗?如果tree
返回任何对(:root tree)
等有用的内容,则对其调用endsWith
方法将无效。你说的是jvm上类型中的字符串,还是树表示法中的某个路径称为字符串?对于其他好奇的人来说,最后一行的可读版本是(str v“l”“(preorder l)”“r”“(preorder))
,关于堆栈,我认为用lazy cat
替换concat
可以解决这个问题issue@noisesmith我不确定。将整个表达式包装在一个lazy-seq
@noises中可能会这样,但我宁愿将整个函数体包装在一个lazy-seq
中。