【问题标题】:Building a string in Clojure with recursion在 Clojure 中使用递归构建字符串
【发布时间】:2019-12-21 17:13:55
【问题描述】:

我需要生成一个随机字符并构建一个字符串,并且仅在我的字符串包含新生成的字符时才停止。


(defn rand-char [len]
  (apply str (take len (repeatedly #(char (+ (rand 26) 65))))))

(def random-string
  (loop [x (rand-char 1)
         result []]
    (if (some #(= x %) result)
      (apply str (conj result x))
      (recur (conj result x) (x (rand-char 1))))))

我来了

java.lang.String cannot be cast to clojure.lang.IFn

【问题讨论】:

    标签: loops recursion clojure


    【解决方案1】:

    这样的东西对你有用吗?

    (defn random-string []
      (loop [x (rand-char 1)
             result []]
        (if (.contains result x)
          (apply str result)
          (recur (rand-char 1) (conj result x)))))
    

    【讨论】:

    • 感谢您的帮助。我已经接受了 Lee 的回答,此后我也选择将 result 直接构建为字符串。
    【解决方案2】:

    rand-char 返回 string 但在 (x (rand-char 1)) 中,您试图将 x 作为函数调用,因此出现错误。您只需要调用rand-char 来生成下一个随机字符串即可尝试。 recur 的参数应与loop 中声明的参数顺序相同,因此您的顺序错误:

    (recur (rand-char 1) (conj result x))
    

    【讨论】:

    • @rake-write-code - 你想让random-string 成为一个函数吗?目前你正在使用def,所以它被评估为一个向量。 (random-string) 正在尝试将向量作为函数调用。向量是从索引到相应值的函数,例如([1 2 3] 0) => 1 所以你得到错误是因为你没有提供足够的参数。看起来您应该使用defn 定义random-string,例如(defn random-string [] ...).
    • 嗨@lee,感谢所有指针,它应该是一种方法,我只需将 0 作为参数传递就可以运行它。我已经能够打印一个正确的字符串,但我希望它返回并且它评估为空引用。 (def random-string (loop [x (rand-char 1) result ""] (if (.contains result x) (println (str result x)) (recur (rand-char 1) (str result x))))) 但我不想打印它而是返回它。只是返回 (str result x) 说 java.lang.String 不能转换为 clojure.lang.IFn 。
    • 感谢您的帮助@lee,我明白了。我只需要在定义它时将向量传递给函数。
    猜你喜欢
    • 2014-01-01
    • 2017-10-08
    • 2019-06-03
    • 1970-01-01
    • 2021-12-28
    • 2016-02-10
    • 1970-01-01
    • 2020-10-04
    • 2014-09-03
    相关资源
    最近更新 更多