首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使一个函数在Clojure中最多N次执行另一个函数?

如何使一个函数在Clojure中最多N次执行另一个函数?
EN

Stack Overflow用户
提问于 2014-10-30 16:23:39
回答 2查看 173关注 0票数 3

首先,我有这样一个Mysql表:

create table t (id int(11) PRIMARY KEY unsigned NOT NULL AUTO_INCREMENT, name varchar(20), age int(10));

我定义了一个函数,它将在t中创建一行:

代码语言:javascript
复制
(require '[honeysql.core :as sql])

(defn do-something []
    (sql/query {:insert-into  :t
                :values [{:name "name1" :age 10}]})
    (> 3 (rand-int 5)))

现在我想运行这个函数,直到它返回true,但最多是N次。

take-times代码是错误的,因为重复将对do-something函数进行一次验证,然后构造延迟序列。

代码语言:javascript
复制
(defn take-times []
   (some true? (repeat 5 (do-something))))

无论take-times2返回什么,这个do-something都将运行5次。

代码语言:javascript
复制
(defn take-times2 []
    (some true? (for [i (range 5)]
                  (do-something))))

如果不使用递归函数和宏,该怎么办?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-30 16:50:49

这应该是可行的:

代码语言:javascript
复制
(->> (repeatedly do-something)
     (take 5)
     (some true?))

更新(04.11.2014):

由于repeatedly实际上允许一个可选的长度参数,所以这也很好:

代码语言:javascript
复制
(some true? (repeatedly 5 do-something))

示例

代码语言:javascript
复制
(defn do-something
  []
  ;; 20% chance of true
  (let [ret (rand-nth [true false false false false])]
    (prn 'hello ret)
    ret))

(defn run
  []
  (->> (repeatedly do-something)
       (take 5)
       (some true?)))

(run)
;; hello false
;; hello false
;; hello true
;; => true

(run)
;; hello false
;; hello false
;; hello false
;; hello false
;; hello false
;; => nil
票数 5
EN

Stack Overflow用户

发布于 2014-10-30 17:59:17

该约简函数具有根据用户定义的标准停止处理序列的约简选项。

使用正误随机序列

代码语言:javascript
复制
(defn rand-seq [] (repeatedly #(rand-nth [true false false false false])))

使用“约简”生成向量,直到找到真或达到最大虚值数为止。

代码语言:javascript
复制
(defn at-most-or-true [s max-false]
  (reduce (fn [acc v]
      (if (and (not v) (< (count acc) max-false))
        (conj acc v)
        (reduced acc))) 
    [] s))

这可以通过调用

代码语言:javascript
复制
 (at-most-or-true (rand-seq) 5)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26658276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档