Die bisherigen Antworten sind die Verwendung/Emulation veränderlicher Datentypen, aber wie sieht ein funktionaler Ansatz aus?
Um das zu sehen, zerlegen wir das Problem in einige funktionale Komponenten:
Da die Gaußsche Elimination eine Folge von Zeilenoperationen erfordert, ist es sinnvoll, zunächst eine Funktion zu definieren, die 2 Zeilen und Skalierungsfaktoren annimmt und das resultierende Ergebnis der Zeilenoperation zurückgibt.
Die gewünschten Zeilenoperationen sollten eine Variable (Spalte) aus einer bestimmten Zeile eliminieren. Definieren wir also eine Funktion, die ein Paar von Zeilen und einen Spaltenindex annimmt und die zuvor definierte Zeilenoperation verwendet, um die geänderte Zeile mit dem Spalteneintrag Null zurückzugeben.
Dann definieren wir zwei Funktionen, eine zur Umwandlung einer Matrix in die Dreiecksform und eine weitere zur Rücksubstitution einer Dreiecksmatrix in die Diagonalform (unter Verwendung der zuvor definierten Funktionen), indem wir nacheinander jede Spalte eliminieren. Wir können über die Spalten iterieren oder rekursieren, und die Matrix kann als Liste, Vektor oder Array von Listen, Vektoren oder Arrays definiert werden. Die Eingabe wird nicht verändert, aber es wird eine modifizierte Matrix zurückgegeben, so dass wir schließlich tun können:
let out_matrix = to_diagonal (to_triangular in_matrix);
Es ist nicht entscheidend, ob die Datentypen (Array oder Liste) veränderbar sind, sondern wie sie verwendet werden. Dieser Ansatz ist vielleicht nicht besonders "clever" oder der effizienteste Weg, um Gaußsche Eliminationen in OCaml durchzuführen, aber durch die Verwendung reiner Funktionen können Sie den Algorithmus sauber ausdrücken.