Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure打印列表两次,而我只调用打印一次_Clojure - Fatal编程技术网

Clojure打印列表两次,而我只调用打印一次

Clojure打印列表两次,而我只调用打印一次,clojure,Clojure,因此,在一次Java开发人员职位的面试中,我被要求设计一种算法,从一百万个值的数组中找出十个最大的值。我想出了一个简单的暴力算法,让面试官非常满意。我明天去参加第二轮面试 因为我喜欢挑战自己,所以我一直在阅读“Clojure for the Brave and True”,并在采访结束后不久进入了关于惰性序列和集合的部分,开始怀疑我是否无法实现Clojure函数来完成相同的任务 我的实际过滤功能工作正常,但无法理解运行应用程序时看到的内容。这是我的密码: (defn random-numbers

因此,在一次Java开发人员职位的面试中,我被要求设计一种算法,从一百万个值的数组中找出十个最大的值。我想出了一个简单的暴力算法,让面试官非常满意。我明天去参加第二轮面试

因为我喜欢挑战自己,所以我一直在阅读“Clojure for the Brave and True”,并在采访结束后不久进入了关于惰性序列和集合的部分,开始怀疑我是否无法实现Clojure函数来完成相同的任务

我的实际过滤功能工作正常,但无法理解运行应用程序时看到的内容。这是我的密码:

(defn random-numbers
  ([] (random-numbers 0))
  ([n] (cons n (lazy-seq (random-numbers (rand 10000))))))

(def big-array (take 1000000 (random-numbers)))

(defn top-ten [[big0 big1 big2 big3 big4 big5 big6 big7 big8 big9 :as acc] x]
  (cond
    (> x big0) [x big1 big2 big3 big4 big5 big6 big7 big8 big9]
    (> x big1) [big0 x big2 big3 big4 big5 big6 big7 big8 big9]
    (> x big2) [big0 big1 x big3 big4 big5 big6 big7 big8 big9]
    (> x big3) [big0 big1 big2 x big4 big5 big6 big7 big8 big9]
    (> x big4) [big0 big1 big2 big3 x big5 big6 big7 big8 big9]
    (> x big5) [big0 big1 big2 big3 big4 x big6 big7 big8 big9]
    (> x big6) [big0 big1 big2 big3 big4 big5 x big7 big8 big9]
    (> x big7) [big0 big1 big2 big3 big4 big5 big6 x big8 big9]
    (> x big8) [big0 big1 big2 big3 big4 big5 big6 big7 x big9]
    (> x big9) [big0 big1 big2 big3 big4 big5 big6 big7 big8 x]
    :else acc))

(defn top-ten-list [coll]
  (reduce top-ten [0 0 0 0 0 0 0 0 0 0] coll))

(defn unlines [coll]
  (clojure.string/join \newline coll))

(defn -main []
  (print (unlines (top-ten-list big-array))))

(-main)
它会产生两次预期输出:

9999.978584142405
9999.966008266641
9999.954608202788
9999.925928099525
9999.779899149064
9999.755392364965
9999.75279348399
9999.640257438374
9999.615213138313
9999.447171545269999.978584142405
9999.966008266641
9999.954608202788
9999.925928099525
9999.779899149064
9999.755392364965
9999.75279348399
9999.640257438374
9999.615213138313
9999.44717154526
根据我使用的是print还是println,输出略有变化,因为如果我使用println,第二组输出将从新行开始


我相当肯定第一个输出是我调用函数和处理其结果的方式的产物,但我不确定哪里出了问题

加载命名空间时,将执行底部的
-main
。然后在它上面调用
-main
,再次运行它。因此,只要去掉最后的
(-main)
,就应该完成了。

当加载名称空间时,将执行底部的
-main
。然后在它上面调用
-main
,再次运行它。所以,只要去掉最后的
(-main)
,你就应该完成了。

你是如何执行这个脚本的?只要复制粘贴这个脚本,运行它,我只看到输出的一个版本,而不是两个版本。事实上,我曾经这样运行它:
cat yourscript.clj | lein exec
我是通过单击IntelliJ中的run按钮/命令来运行它的。。。。“我会试试你的方法。”亚历克斯米勒在下面评论说,删除(-main)行可以解决IntelliJ中的问题,确实如此@MatiasElgart建议使用
lien exec
也有效。您如何执行此脚本?只要复制粘贴这个脚本,运行它,我只看到输出的一个版本,而不是两个版本。事实上,我曾经这样运行它:
cat yourscript.clj | lein exec
我是通过单击IntelliJ中的run按钮/命令来运行它的。。。。“我会试试你的方法。”亚历克斯米勒在下面评论说,删除(-main)行可以解决IntelliJ中的问题,确实如此@MatiasElgart建议使用
lien exec
也有效。Alex Miller-感谢您的解释!成功了。亚历克斯·米勒-谢谢你的解释!成功了。