6

私は何かについて混乱しています。不動点コンビネータを使用して、無限回の適用後に数学的に収束するシーケンスの不動点を評価する方法を示す例を (Clojure で) 生成したかったのですが、実際には有限回のステップ後に収束します。浮動小数点の有限精度に。ここで何かが足りないようです。

(defn Y [r]
  ((fn [f] (f f))
   (fn [f]
     (r (fn [x] ((f f) x))))))

(defn simple-convergent [func]
  (fn [x]
    (if (zero? x)
      0.0
      (* 0.5 (func x)))))

私はそれから得ることができます

user=> ((Y simple-convergent) 0.)
0.0
user=> ((Y simple-convergent) 0.2)
java.lang.StackOverflowError (NO_SOURCE_FILE:0)

このスタック オーバーフローがわかりません。より一般的には、私の以前の投稿に関連して、この方法でシーケンスの不動点を近似するために使用できる不動点コンビネーターの「正しい」バージョンを誰かが提示できるかどうか疑問に思っています。

4

1 に答える 1

3

Brian Carper のコメントとしての (正しい) 回答に感謝します。修正したコード

(defn simple-convergent [func]
  (fn [x]
    (if (zero? x)
      0.0
      (func (* 0.5 x)))))

私が期待したように動作します。私の次のプロジェクトは、不安定な不動点を見つける不動点コンビネーターを構築することです。上で実装した Y コンビネータでこれができるとは思えません。

于 2010-07-14T01:44:36.740 に答える