【问题标题】:How do i call a function from given two values in clojure one by one如何从clojure中给定的两个值中一一调用函数
【发布时间】:2018-06-01 06:32:52
【问题描述】:

您好,我是 clojure 的新手,我已经编写了这个函数,其中几乎没有错误。我有一个名为“checkFunction”的函数,它基本上得到一个参数并返回真或假。

(defn getList [number1 number2]
  (loop for x from number1 to number2
    (recur (inc num) (if (checkFunction? x) (concat p [num]) p))))

我希望上面的函数采用两个参数,例如,如果我说 'get List 15 20' 它应该使用 15 16 17 18 19 20 调用检查函数,并且如果 checkFunction 返回 true 它应该将该数字放入 vectorreturn 它或 print 它。到目前为止,我已经做到了这一点,但我有点挣扎。

任何帮助或正确的方向将非常感激。

【问题讨论】:

    标签: clojure functional-programming lisp


    【解决方案1】:

    如果我理解您的问题,您正在尝试根据某个谓词过滤一系列数字。 (为了这个例子,我将你的 check-function? 设置为对奇数返回 true。)

    (defn check-function? [n]
      (odd? n))
    
    (defn get-list [n1 n2]
      (filter check-function? (range n1 (+ 1 n2))))
    
    > (get-list 15 20)
    (15 17 19)
    

    如果您还对循环递归的工作方式感兴趣,这里有一个更类似于您最初尝试做的版本。但我要说的是,关于 clojure 的最好的事情之一就是你很少需要这样做!

    (defn get-list-2 [n1 n2]
      (loop [src (range n1 (+ 1 n2)) dest []]
        (if (empty? src)
          dest
          (let [n (first src)
                src (rest src)
                dest (if (check-function? n) (conj dest n) dest)]
            (recur src dest)))))
    
    > (get-list-2 15 20)
    [15 17 19]
    

    【讨论】:

    • 我觉得他是在努力学习如何编写过滤函数,所以使用内置函数对他学习没有帮助。
    • 这是一个公平的观点,我可能应该在发帖前在评论中问这个问题。
    • @Barmar 你也是对的,但这也可以
    • 更新了一个显示循环递归工作原理的版本。
    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 2015-05-16
    • 2013-11-15
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多