2

次のコードの問題は何ですか:func式は式を含むことができる用語を含む式を取得します...

(defn term[]
    (def mytmp (zip/xml-zip {:tag :term}))
    (cond 
      (= (first(:content(first vecTok))) "(")
        (do
          (def mytmp (popVecTo mytmp))
          (def mytmp (zip/append-child mytmp (expression)))
          (def mytmp (popVecTo mytmp)))
      :else 
          (def mytmp (popVecTo mytmp)))
    (zip/node mytmp))
(defn expression[]
    (def mytmp (zip/xml-zip {:tag :expression}))
    (def mytmp (zip/append-child mytmp (term)))
    (while (contains? #{"+", "-", "*","/", "&", "|", "<", ">", "="} (first(:content(first vecTok))) )
      (do
        (def mytmp (popVecTo mytmp))
        (def mytmp (zip/append-child mytmp (term)))))
    (zip/node mytmp))
(def vecTok (vec (:content(first(xml-seq (parse  "C:/Users/User/Desktop/forHekronot/BallT.xml"))))))

ファイル内:

<a><symbol>(</symbol><identifier>dy</identifier><symbol>-</symbol><identifier>dx</identifier><symbol>)</symbol></a>
4

1 に答える 1

1

問題をよりよく解決する方法についての@jszakmeisterのコメントにもかかわらず、質問に答えてみようと思います。

あなたは最初(def expression)にそして次に(defn term [] ...)そして最後にすることができます(defn expression [] ...)

間接再帰の典型的な例は、もちろん、正の数に対する貧乏人の奇関数/偶関数です。

clojurec.core=> (def even)
#'clojurec.core/even
clojurec.core=> (defn odd [x]  (and (not (= x 0)) (even (dec x))))
#'clojurec.core/odd
clojurec.core=> (defn even [x] (or (= x 0) (odd (dec x))))
#'clojurec.core/even
clojurec.core=> (even 10)
true 
clojurec.core=> (odd 10)
false
clojurec.core=> (odd 10000)
StackOverflowError   clojure.lang.Numbers.equal (Numbers.java:214)

おっと、ファイルのサイズ(または深さ)によっては、これが問題になる可能性があります。trampolineしかし、すべてが失われるわけではありません。内部で使用することも再定義できます。

(defn even [n] 
  (letfn [(evenrec [x] (or (= x 0) #(oddrec (dec x)))) 
          (oddrec  [x] (and (not (= x 0)) #(evenrec (dec x))))]
    (trampoline evenrec n)))
于 2012-10-01T19:00:29.847 に答える