2017-06-24 3 views
0

Was ist der korrekteste Weg, um diesen C++ - Code in clojure zu übersetzen?was ist äquivalent zu + = operator in clojure

Codebeispiel: if((J%2) == 0) {det += src[0][J]*calcDet(min, ord-1)};}

+1

mehr Kontext? Wird dies während der Iteration durch 'J' (gleich der Länge '(count (first src))') verwendet, würde dies die Vorschläge stark beeinflussen. –

Antwort

4

Mit dem C++ Code der Wert det geändert wird. Hier ist ein neuer Wert für det zurückgegeben werden:

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

Es ist korrekteste zu sein Veränderlichkeit aus dem Code zu entfernen.

J und det scheinen die einzigen Variablen zu sein, die sich ändern, also habe ich sie zusammen als die letzten beiden Argumente. Möglicherweise möchten Sie reduce über Werte von J, wobei det der Akku ist, in diesem Fall partial verwenden, um eine Funktion zu erhalten, die die letzten zwei noch zu liefernden Argumente übrig lässt.

Alternativ könnten Sie iterate über eine ähnliche Funktion, eine faule Liste von neuen Zuständen erzeugen, wobei jeder Zustand [J det] ist.

Es gibt keine Entsprechung zu += in Clojure.

0

Nun, der Ausdruck berechnet wird, dass Sie det hinzufügen möchten sieht wie folgt aus:

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

Ihr if, unter der Annahme, dass es keine andere ist, sieht wie folgt aus:

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

Und ein if mit einem else Zweig sieht aus wie:

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

So fügen Sie Rufnummern, die Sie tun:

(+ 1 2 3) 

jedoch, wenn es um += kommt ...

clojurically Zu denken, bedeutet, über Auswerten von Ausdrücken zu denken. Werte sind nicht veränderbar. Anstatt Wechseldet, was möchten Sie wirklich tun? Nun, Sie möchten einen Wert berechnen, der zu dem Wert addiert wird, den Sie derzeit an den Namen det gebunden haben. Dann können Sie entweder dieses Ergebnis an einen Namen binden oder es in einen anderen Ausdruck einspeisen. Kein Zustand, nur Ausdrücke auswerten.

Das heißt, ohne größeren Kontext ist es sinnlos, an ein "Äquivalent" zu denken, weil die ganze Herangehensweise an das Problem anders wäre.

Schleifen, indizierte Arrays und In-Place-Mutation sind alle Funktionen Ihres Code-Snippets. Während diese im Einklang mit moderner Hardware-Architektur stehen (aka, "Computer sprechen"), sind sie manchmal nicht konsistent mit der Art, wie unsere menschlichen Gehirne Probleme natürlich angehen. Ein Abstraktionsniveau erlaubt uns oft, das Problem als Ganzes herauszuzoomen und das Problem als Ganzes zu betrachten, wo wir oft eine bessere Lösung finden, wenn wir dazu Werkzeuge zur Verfügung haben.

Also, ohne den Kontext dieses Codes zu kennen, gibt es kein "Äquivalent", zumindest kein idiomatisches. Ich habe speziell keine Atome erwähnt, die einen von clojures Mechanismen sind, um den Zustand zu erhalten und zu mutieren, da sie für dieses Codebeispiel sicherlich nicht anwendbar sind.

Verwandte Themen