【发布时间】:2017-04-03 18:00:52
【问题描述】:
场上有 100 头水牛。 场上有 100 支拂尘。 每头站立的水牛吃 5 个拂子。 每头躺着的水牛吃 3 根拂子。 每 3 头老水牛吃 1 把。 场地上有多少头每种类型的水牛?
这是我用来解决这个问题的 Clojure 代码:
;; s: number of Standing buffaloes
;; l: number of Lying buffaloes
;; o: number of Old buffaloes
(for [s (range 101) l (range 101) o (range 101)
:while (and
(= 100 (+ s l o)
(= 100 (+ (* s 5) (* l 3) (* o 1/3)))))]
[s l o])
我的代码不起作用。它应该返回每种类型的水牛数量,但我的代码只返回一个空序列。这似乎在逻辑上是不正确的。它有什么问题?
【问题讨论】:
-
这太模糊了。不工作怎么办?你调试过吗?我也不知道 for 循环是否是这里工作的最佳工具。我认为您将 Clojure 的 for 循环与典型的命令式 for 循环混淆了。 Clojure 的 for 循环类似于 Python 的列表推导式。
-
不起作用意味着:结果不正确。它应该返回有多少站立的、躺着的、老水牛在场上。但我的代码只返回一个空序列。这在逻辑上是不正确的。
-
再一次,我认为 for 循环在这里不合适。当您想要生成某物的列表时,您可以使用 for 循环。这是它的主要用例。这听起来不像你想在这里做的。
-
为什么不呢?我创建了一个可能的结果列表。例如,可以有 8 头站立的水牛或 10 或 11 头或其他。可能的结果是从 0 到 100。因此(范围 101)。
-
你不想产生 3 个值吗?每种类型的水牛 1 个?
loop/recur模式似乎更合适。
标签: clojure