在Clojure中实现中断
如果条件匹配并返回最后一个值,是否有办法在Clojure中中断循环?大多数算法在找到结果时返回结果,避免完成整个执行过程,从而受益匪浅 假设我有一个100个数字的向量,范围从0到100,我想找到数字10。一旦找到10,我希望停止执行 比我的示例更简单的情况如下:在Clojure中实现中断,clojure,Clojure,如果条件匹配并返回最后一个值,是否有办法在Clojure中中断循环?大多数算法在找到结果时返回结果,避免完成整个执行过程,从而受益匪浅 假设我有一个100个数字的向量,范围从0到100,我想找到数字10。一旦找到10,我希望停止执行 比我的示例更简单的情况如下: (defn MySearch [y] (when (< y 10) ;;Corrected. Thanks to dsm who pointed it out. Previously was (< y 5)
(defn MySearch
[y]
(when (< y 10)
;;Corrected. Thanks to dsm who pointed it out. Previously was (< y 5).
(if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
(println
"I found it! Now I want to stop executing!"
)
)
(recur
(inc y)
)
)
)
(MySearch 0)
user=> (loop [[x & t] [0 1 2 3 4 5 6 7 8 9]]
#_=> (println "x=" x)
#_=> (if (= x 5)
#_=> x
#_=> (recur t)))
x= 0
x= 1
x= 2
x= 3
x= 4
x= 5
5
user=>
(defn MySearch
[y]
(当(
当我找到5时,我如何停止
我已经搜索够了,我找不到任何方法来实现这一点。我在这里也找到了一个答案,说明我所问的问题在Clojure中并不存在,但我觉得有点牵强。即使是这样,我自己能实现这样的东西吗
(我是Clojure的新手。)您实际上不需要
break
语句,因为循环在Clojure中的工作方式与在java中的工作方式非常不同。例如:
(defn MySearch
[y]
(when (< y 10)
;;Corrected. Thanks to dsm who pointed it out. Previously was (< y 5).
(if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
(println
"I found it! Now I want to stop executing!"
)
)
(recur
(inc y)
)
)
)
(MySearch 0)
user=> (loop [[x & t] [0 1 2 3 4 5 6 7 8 9]]
#_=> (println "x=" x)
#_=> (if (= x 5)
#_=> x
#_=> (recur t)))
x= 0
x= 1
x= 2
x= 3
x= 4
x= 5
5
user=>
如果(x==5)中断,则大致相当于代码>在java中
您必须记住,在clojure中,它本身并不循环,而是设置一个目标
我建议你仔细研究一下这个问题,以便熟悉其中更奇怪的方面
编辑:在我盗用我的响应时,您似乎添加了一些代码,但不用担心,命名函数也是一个重复目标,所以我上面所说的仍然适用:)。以下是以更lisp-y格式重新格式化的代码:
user=> ; FYI: This function will never print "success"
user=> (defn my-search
#_=> [y]
#_=> (if (< y 5) ; <-- Because of this.
#_=> (if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
#_=> (println "Success!")
#_=> (recur (+ y 1)))
#_=> (println "y is >= 5")))
#'user/my-search
user=> (my-search 3)
y is >= 5
nil
user=>
user=>;仅供参考:此功能永远不会打印“成功”
用户=>(定义我的搜索)
#_=>[y]
#_=>(如果((打印“成功!”)
#_=>(重复出现(+y 1)))
#_=>(println“y大于等于5”))
#'用户/我的搜索
用户=>(我的搜索3)
y大于等于5
无
用户=>
你几乎把它做好了。重新格式化你的代码,我们得到
(defn MySearch [y]
(when (< y 10)
(if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
"I found it! Now I want to stop executing!")
(recur (inc y))))
为什么?
问题在于(重现…
在if
之外。这有什么用
- 如果满足
时的(
条件,则(如果…
和
依次执行(重现…
,并返回后者的结果
返回李>
- 最后,
y
是10
,因此当条件失败时,当
返回nil
李>
如果
,让我们将重现移动到中:
(defn MySearch [y]
(when (< y 10)
(if (= (nth [1 2 3 4 5 6 7 8 9 10] y) 10)
"I found it! Now I want to stop executing!"
(recur (inc y)))))
因为我们返回了消息,所以我们知道函数确实停止了执行。否则它将继续并返回nil
当println
处于适当位置时,函数将输出消息并立即返回nil
,就像它继续执行时一样。至于它是否停止执行,你一点也不知道
顺便说一下,作为本书的作者,让我再试一次:
- Clojure中没有break语句
- 反过来说:
- 默认情况下,您将中断循环李>
- 您必须使用
recur
继续李>
recur
是对正在执行的函数(或loop
)的特殊递归调用:
- 其中它是返回值
- 据说它处于尾部位置
大多数Lisp系统自动检测这样的调用,即所谓的尾部调用。
因此,它们没有或不需要像recur
这样的构造
话虽如此,Clojure 1.5引入了reduced
:一种类似于break
的reduce结构。你可以读到它 你能在这里放一些示例代码吗?当然,我现在就编辑它!我写这个函数的时候考虑到了其他一些东西,然后我在不改变条件的情况下改变了向量。谢谢你的指点!你的答案很有帮助,但另一个答案完全回答了我的问题,并给出了明确的解释。我不得不接受这个。不过,非常感谢。:)非常感谢你!回答得很好!这不是我所指的答案。另外,你在超链接中放置的超链接非常棒,也非常有用+1:P