Clojure 正在转换为循环。。。递归

Clojure 正在转换为循环。。。递归,clojure,Clojure,据我所知,在Clojure中递归而不使用循环。。对于短序列,递归语法可能不是问题。但是,使用循环。。递归语法是编写递归函数的首选方法。因此,我想从首选方法开始 然而,我一直在努力转换这个函数[edit],它返回序列的骨架(没有值的序列结构) 用这些数据进行测试 (def test_data1 '(1 (2 3) ( ) (( )) :a)) (def test_data2 '(1 2 (3 4) (5 ( 6 7 8)))) 循环。。重复语法。任何指向示例的想法或指针都将不胜感激。循环和重现是

据我所知,在Clojure中递归而不使用循环。。对于短序列,递归语法可能不是问题。但是,使用循环。。递归语法是编写递归函数的首选方法。因此,我想从首选方法开始

然而,我一直在努力转换这个函数[edit],它返回序列的骨架(没有值的序列结构)

用这些数据进行测试

(def test_data1 '(1 (2 3) ( ) (( )) :a))
(def test_data2 '(1 2 (3 4) (5 ( 6 7 8))))

循环。。重复语法。任何指向示例的想法或指针都将不胜感激。

循环和重现是一个简单迭代的转换。然而,下降到树中本质上是递归的。您必须手动维护堆栈,以便将其转换为单个迭代。因此,您的代码没有“简单”的转换。

您可能需要查看拉链库,该库允许良好的结构化树编辑,尽管它可能不如您的原始区域优雅。我几乎不需要使用循环。。。重现几乎总是有一个更高阶的函数以同样或更好的效率更优雅地解决问题


map
替换为
循环。。。重复
使代码更冗长,更不清晰。您也失去了分块序列的好处。

请查看clojure.walk源代码。它是一个对所有Clojure嵌套数据结构(不包括有序映射)执行(批量)操作的库。其中有一些非常强大但看似简单的代码,通过本地定义的匿名函数使用递归,而不使用循环/递归

其中的大多数函数都基于postwalk和prewalk函数,而这两个函数又都基于walk函数。使用源代码和(走前演示表单)和(走后演示表单),您可以很好地了解所采取的递归步骤

我不知道这是否能帮你解决问题。我目前正试图在同一个问题域中做一些事情:创建一个函数,将嵌套映射和向量“展平”为从根到叶的所有路径序列,每个路径都是以“叶”值结尾的键和/或索引序列


这个库似乎使得在整个结构中递归地编辑值变得非常简单。但是,我仍然不知道如何使用它在功能上跟踪迭代之间积累的数据,这些数据是我的“路径”以及您的“骨架”问题所需要的。

谢谢。我知道Clojure.zip,但我想试着用自己的方法提取骨架。这个例子来自UPenn的一些研究生计算机科学练习。你的回答至少告诉我这不是一个简单的问题。谢谢,谢谢。你指的是Clojure.zip,对吗?我知道它,会使用它,我想做这个练习,但没有。蹦床也是一个有趣的功能,除了循环重现知道,虽然不直接适用于这里。
(def test_data1 '(1 (2 3) ( ) (( )) :a))
(def test_data2 '(1 2 (3 4) (5 ( 6 7 8))))