Recursion 递归运行Clojure中的向量

Recursion 递归运行Clojure中的向量,recursion,clojure,Recursion,Clojure,我刚开始和Clojure玩 如何遍历项目向量 我天真的递归函数的形式类似于经典的map (defn map [f xs] ( (if (= xs []) [] (cons (f (first xs)) (map f (rest xs)) ) )) 问题是我在网上找不到这种代码的例子。我发现很多例子都使用内置的序列遍历函数,比如for、map和loop。但是没有人做原始的递归版本 那是因为你不应该在Clojure做这种事吗?(例如,因为它使用较低级别的Java原语

我刚开始和Clojure玩

如何遍历项目向量

我天真的递归函数的形式类似于经典的map

(defn map [f xs] (
  (if (= xs [])
      []
      (cons (f (first xs)) (map f (rest xs))
  )
))
问题是我在网上找不到这种代码的例子。我发现很多例子都使用内置的序列遍历函数,比如for、map和loop。但是没有人做原始的递归版本


那是因为你不应该在Clojure做这种事吗?(例如,因为它使用较低级别的Java原语,而这些原语没有尾部调用优化或其他功能?)

Clojure仅在尾部递归时以及仅在使用显式
recur
调用时重新使用堆栈帧。其他的一切都会消耗掉。上面的映射示例不是尾部递归的,因为cons发生在递归调用之后,所以不能在任何语言中进行TCO。如果您将其切换为使用延续传递样式,并使用显式调用
recur
而不是
map
,那么您应该可以开始了

Clojure仅在尾部递归和使用显式
recur
调用时才重新使用堆栈帧。其他的一切都会消耗掉。上面的映射示例不是尾部递归的,因为cons发生在递归调用之后,所以不能在任何语言中进行TCO。如果您将其切换为使用延续传递样式,并使用显式调用
recur
而不是
map
,那么您应该可以开始了

Clojure仅在尾部递归和使用显式
recur
调用时才重新使用堆栈帧。其他的一切都会消耗掉。上面的映射示例不是尾部递归的,因为cons发生在递归调用之后,所以不能在任何语言中进行TCO。如果您将其切换为使用延续传递样式,并使用显式调用
recur
而不是
map
,那么您应该可以开始了

Clojure仅在尾部递归和使用显式
recur
调用时才重新使用堆栈帧。其他的一切都会消耗掉。上面的映射示例不是尾部递归的,因为cons发生在递归调用之后,所以不能在任何语言中进行TCO。如果您将其切换为使用延续传递样式,并使用显式调用
recur
而不是
map
,那么您应该可以开始了

当你说“穿过向量”时,这是相当模糊的;由于Clojure是一种lisp语言,因此擅长序列分析和操作,因此使用这种语言的好处在于,你不会用“遍历一个向量,然后对每个元素进行处理”的术语来思考,相反,你会更习惯地说“从向量中提取这个”或“将这个向量转换为X”或“我希望这个向量给我X”

正是由于lisp语言中的这种透视图,您将看到如此多的示例和生成代码,这些示例和代码不仅循环/重现于向量中,而且以一种简短、惯用的方式具体地追求所需的内容。使用诸如
reduce
映射
过滤
等简单功能,将
转换为
和其他功能,您可以优雅地移动序列,如向量,同时对内容执行所需操作。在大多数其他语言中,这将至少是两个不同的部分:循环,然后是实际的逻辑来做你想做的事情

<>你经常会发现,如果你用C语言、C++语言、java语言等更为迫切的思想来思考序列,那么你的代码比你用更为实用的方法首先考虑你的计划的时间长至少4倍。

当你说“通过一个向量”时,这是相当模糊的;由于Clojure是一种lisp语言,因此擅长序列分析和操作,因此使用这种语言的好处在于,你不会用“遍历一个向量,然后对每个元素进行处理”的术语来思考,相反,你会更习惯地说“从向量中提取这个”或“将这个向量转换为X”或“我希望这个向量给我X”

正是由于lisp语言中的这种透视图,您将看到如此多的示例和生成代码,这些示例和代码不仅循环/重现于向量中,而且以一种简短、惯用的方式具体地追求所需的内容。使用诸如
reduce
映射
过滤
等简单功能,将
转换为
和其他功能,您可以优雅地移动序列,如向量,同时对内容执行所需操作。在大多数其他语言中,这将至少是两个不同的部分:循环,然后是实际的逻辑来做你想做的事情

<>你经常会发现,如果你用C语言、C++语言、java语言等更为迫切的思想来思考序列,那么你的代码比你用更为实用的方法首先考虑你的计划的时间长至少4倍。

当你说“通过一个向量”时,这是相当模糊的;由于Clojure是一种lisp语言,因此擅长序列分析和操作,因此使用这种语言的好处在于,你不会用“遍历一个向量,然后对每个元素进行处理”的术语来思考,相反,你会更习惯地说“从向量中提取这个”或“将这个向量转换为X”或“我希望这个向量给我X”

正是由于lisp语言中的这种透视图,您将看到如此多的示例和生成代码,这些示例和代码不仅循环/重现于向量中,而且以一种简短、惯用的方式具体地追求所需的内容。使用诸如
reduce
映射
过滤
等简单功能,将
转换为
和其他功能,您可以优雅地移动序列,如向量,同时对内容执行所需操作。在大多数其他语言中,这将是