2017-06-24 5 views
0

このC++コードをclojureに変換する最も正しい方法は何ですか?clojureの+ =演算子に相当するもの

コードサンプル:C++コードでif((J%2) == 0) {det += src[0][J]*calcDet(min, ord-1)};}

+1

more context?これは 'J 'を反復しながら(長さ'(count(first src))に等しい) '使用されます。もしそうなら、それは提案に大きな影響を与えます。 –

答えて

4

detの値が変更されています。ここでdetの新しい値が返される:

(fn [calcDet src ord min det J] 
    (if (zero? (mod J 2)) 
    (+ det (* (nth (nth src 0) J) 
       (calcDet min (dec ord)))) 
    det)) 

あなたのコードから可変性を取り除くこと最も正確です。

Jdetが変更されている唯一の変数であるように思われるので、私はそれらを最後の2つの引数としてまとめました。 Jの値がreduceの場合は、detがアキュムレータです。この場合、最後の2つの引数がまだ残っていない関数を得るにはpartialを使用します。

また、同様の機能でiterateを実行すると、新しい状態の遅延リストを生成することができます。各状態は[J det]です。

Clojureには+=と等価はありません。

0

さて、あなたはdetに追加することを計算している式は次のようになります。

(* (get-in src [0 J]) (calcDet min (dec ord))) 

あなたif、何も他には存在しないと仮定して、次のようになります。

(when (even? J) 
    ... do something) 

そして、 elseブランチのifは次のようになります。

(if (even? J) 
    ... do something 
    ... otherwise, do something else) 

追加する数字は、あなたが実行します。それは

が思うには... +=に来るとき

(+ 1 2 3) 

しかし、clojurically式を評価について考えることを意味します。値は変更できません。 の代わりにdetを入力してください。は本当にになりますか?あなたは現在、名前がdetにバインドされている値に何らかの値を追加したいと思っています。次に、結果を名前にバインドするか、別の式に入力します。状態はなく、表現を評価するだけです。

大きな文脈がなければ、問題の全体的なアプローチが異なるため、「同等」と考えるのは無意味です。

ルーピング、インデックス配列、およびインプレース突然変異は、すべてコードスニペットの機能です。これらは現代のハードウェアアーキテクチャ(「コンピュータが話す」という)と一貫していますが、人間の脳が自然に問題に近づく方法と一貫しないことがあります。だから、これを上に抽象化のレベルは、しばしば私たちは "ズームアウト"し、全体的に見て、私たちはしばしばそれを行うためのツールが与えられた場合は、より洗練された解決策を見つける。

したがって、このコードのコンテキストを知らなくても、少なくとも同等のものはありません。少なくとも慣用的ではありません。私は具体的に原子を言及しませんでした。これは、このコードでは当てはまりませんので、状態を保持して変更するためのクロージャのメカニズムの1つです。

関連する問題