7

ほとんどの参照は演算子に関するものであり、関数のすべてのアプリケーションは非常に混乱しているため、コードでのiterate使用方法や、それが何であるかはまだわかりません。iteratepartial

私はプログラミングの宿題をしていて、ニュートン法を使用して数値 n の平方根を取得しようとしています。つまり、初期近似としての推測を使用して、近似と n/近似の平均を計算することにより、新しい近似を計算し続けます。最新の 2 つの近似値の差がイプシロン未満になるまで続けます。

私は最初に近似部分をやろうとしています。それは反復と部分を使用する必要があると思います。そして後で、イプシロンは「テイク」を使用する必要があるものですか?

イプシロンなしで近似するためのコードは次のとおりです。

(defn sqrt [n guess]
  (iterate (partial sqrt n) (/ (+ n (/ n guess)) 2)))

このコードは正しく機能しませんが、入力する(sqrt 2 2)と が表示されます(3/2 user=> ClassCastException clojure.lang.Cons cannot be cast to java.lang.Number clojure.lang.Numbers.divide (Numbers.java:155)

これは何度も繰り返す必要がある部分だと思いますか?誰かヒントを教えてください。繰り返しますが、これは宿題の問題なので、問題全体の直接的な解決策を私に提供しないでください。私が学べるアイデアと説明が必要です。

4

3 に答える 3

6

partial関数とその関数の少なくとも 1 つのパラメーターを取り、残りのパラメーターを期待する新しい関数を返します。

(def take-five (partial take 5))
(take-five [1 2 3 4 5 6 7 8 9 10])
;=> (1 2 3 4 5)

iterate関数とシード値の 2 つのパラメーターを使用して、無限シーケンスを生成します。シード値は生成されたリストの最初の要素として使用され、2 番目の値はシードに関数を適用して計算され、2 番目の値は関数の入力として使用されて 3 番目の値が取得されます。

(take-five (iterate inc 0))
;=> (0 1 2 3 4)

ClojureDocs は両方の関数に関する優れたドキュメントを提供しています: http://clojuredocs.org/clojure_core/clojure.core/iteratehttp://clojuredocs.org/clojure_core/clojure.core/partial

于 2013-11-03T08:41:30.927 に答える
4

iterateしたがって、@ponzao は何をどのように行うかを非常によく説明し、@ partialyonki は実際には必要ないことを指摘しました。より多くの seq 関数を探索したい場合は、とにかく試してみることをお勧めします (ただし、遅延シーケンスによるオーバーヘッドにより、理想的なパフォーマンスが得られない可能性があります)。

ヒント:

  • (iterate #(sqrt n %) initial-approximation)一連の近似値が得られます。
  • を使用partitionして、後続の近似のペアを作成できます。
  • を使用してイプシロン条件を満たさないものはすべて破棄しますdrop-while
  • 結果を得る。

多くの有用な seq 関数と接触するので、シーケンスを使用してこれを解決することはおそらく非常にやりがいがあります。

注:この回答の編集履歴のどこかに完全な解決策があります。申し訳ありませんが、「宿題」の部分を完全に取得できませんでした。

于 2013-11-03T11:07:45.437 に答える
0

私はあなたが要点を逃していると思います。iterateどちらも必要ありませpartialん。

条件が満たされるまで何らかの計算を実行する必要がある場合は、わかりやすいloop/recur命令を使用できます。loop/recur次のように理解できます: 何らかの計算を行い、条件が満たされているかどうかを確認し、満たされている場合は計算された値を返し、そうでない場合は計算を繰り返します。

あなたは完全な解決策を望んでいないので、どこへ行くべきかのアドバイスだけが必要なので、適切に見てloop/recur、すべてがうまくいくでしょう.

@noisesmithは良い点を指摘しました。reduce条件が満たされるまで計算するためのものではありませんが、限られた数のステップで計算を実行する場合に役立つ場合があります。

于 2013-11-03T09:51:22.693 に答える