2024年Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面了解更多关于如何使用本网站的信息。

0
REPL

你好,

我有一个写一个函数的任务,该函数打印单链表的笛卡尔积。
这是讲师给我的,它完美运行,但我就是不懂它是怎么工作的。更具体地说,我搞不清楚这条线(func (:data node))。我知道它会给出节点数据,但func这个函数是干什么的?
对于我来说,slist-cartesian函数完全令人困惑。
请向我解释它是如何工作的。
谢谢!

(defn slist-iter [lst func]
(loop [node (deref (:head lst))]

(if (not (nil? node))
  (do
    (func (:data node))
    (recur (deref (:next node)))))))

(defn slist-cartesian [lst]
(slist-iter
lst
(fn [x]

 (slist-iter
  lst
  (fn [y]
    (println x y))))))

1 答案

0
by
(defn slist-iter [lst func]
  (loop [node (deref (:head lst))]
    (if (not (nil? node))
      (do
        (func (:data node))
        (recur (deref (:next node)))))))

(defn slist-cartesian [lst]
  (slist-iter
   lst
   (fn [x]
     (slist-iter
      lst
      (fn [y]
        (println x y))))))

在我看来,就像funcslist-iter的第二个参数,它是由slist-cartesian调用的。在调用位置,第二个参数实际上是一个匿名函数(这个匿名函数也强有力地调用slist-iter)。

你感到困惑是合理的。

这里有一个更简单的实现

user> (defn slist-cartesian [lst]
        (doseq [x lst
                y lst]
          (println x y)))
#'user/slist-cartesian
user> (slist-cartesian [0 1 2 3 4])
0 0
0 1
0 2
0 3
0 4
1 0
1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
2 4
3 0
3 1
3 2
3 3
3 4
4 0
4 1
4 2
4 3
4 4
nil

希望你得到'A'。 (

...