【问题标题】:Clojure - How to check loop condition AFTER making calculation? [duplicate]Clojure - 如何在计算后检查循环条件? [复制]
【发布时间】:2018-05-09 18:21:26
【问题描述】:

我需要创建一个循环,在第一步中应该计算一些东西,并且应该将计算的结果传递给测试条件。是这样的:

在(条件)时做(某事)

这是强制性的,第一次通过应该在测试条件发生之前进行计算。

在 Clojure 中可以做到吗?

我在 StackOverflow 上发现了类似的问题,但我不清楚。此处介绍的这些解决方案要精确得多。

【问题讨论】:

    标签: loops clojure


    【解决方案1】:

    可能是这样的:

    (ns playground.core)
    
    (defn do-while-loop [init-state do-something condition]
      (loop [state init-state]
        (let [next-state (do-something state)]
          (if (condition next-state)
            (recur next-state)
            next-state))))
    
    
    playground.core> (do-while-loop 0 inc #(< % 6))
    6
    playground.core> (do-while-loop 0 inc #(< % 0))
    1
    

    init-state 是你正在循环的状态,do-something 是一个计算下一个状态的函数,condition 是一个根据状态返回布尔值的函数。

    这是一个纯粹的函数式 do-while-loop,条件被测试下一个状态被计算出来。如果您愿意,您可以随时使用宏在其之上添加额外的语法糖。

    【讨论】:

      【解决方案2】:

      我会在这里使用loop。每当您无法决定要如何循环时,loop 是一个很好的起点,因为它是如此普遍。一个简单的示例如下所示:

      (loop []
        (let [result (some-calc)]
          (if (verify-result result) ; The condition
            (recur) ; Loop again
            result))) ; Or return the result of the calculation
      

      some-calc 是生产者,verify-result 检查是否应该再次循环。

      您甚至可以取消 loop 并使用递归函数:

      (defn func []
        (let [result (some-calc)]
          (if (verify-result result)
            (recur)
            result)))
      

      【讨论】:

      • 好的,这似乎是我的想法的解决方案,但是如果我需要使用具有一些“变量”的计算怎么办?例如:(/ (* 2 temp_val) some_number)。我应该把 temp_val 和 some_number 的定义放在哪里?
      • @Boba_Fett 在let 里面loop
      • 所以它应该是这样的? let [temp_val (blablabla)]let [some_number (blablabla)]let [result (/ (* 2 temp_val) some_number)
      • @Boba_Fett 你只需要1个let:(let [temp-val (stuff) some-num (stuff) result (/ (* 2 temp-val) some-num)] result)
      • 不,我只是习惯了 :)
      猜你喜欢
      • 2014-11-08
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多