习题2.31

先上代码

Clojure 复制代码
(defn square [x](* x x))
(defn square-tree[tree]
  (tree-map square tree)
)

(defn tree-map [op tree]
   (cond (not (seq? tree)) (op tree)
       (empty? tree) nil
       :else (cons (tree-map op (first tree))  (tree-map op (rest tree))
        )
  )
)

题目实际上是想让我们将树的遍历与平方操作分离开,以方便我们实现树的其他操作,比如立方,自加之类的操作。

题目的难点是理解op参数应该在什么时候调用。理解透以后这个题就非常简单。

对比下原来的做法,实际上就是在原来代码中(square tree) 变成(op tree),其他部分没有变化。

相当于将方法以参数的形式传递给方法内部,并在适当的时候调用。这也是函数式编程中经常提及的高阶函数的用法。为后面解释高阶函数做铺垫。

Clojure 复制代码
(defn square-tree[tree]
  (cond (not (seq? tree)) (square tree)
       (empty? tree) nil
       :else (cons (square-tree (first tree))  (square-tree (rest tree))
        )
  )
)
相关推荐
skywalk81632 个月前
Clojure学习:运行在 Java 虚拟机(JVM)上的动态Lisp编程语言
java·lisp·clojure
独爱竹子的功夫熊猫1 年前
运行在JVM上的编程语言,认为只有java你就狭隘了
java·jvm·clojure