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
(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))))))

对我来说,看起来像 func 是 slist-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"。(

...