Ich unterrichte mich OCaml, und die Hauptressourcen, die ich für die Praxis verwende, sind einige Problemsätze, die Cornell von ihrer Klasse 3110 zur Verfügung gestellt hat. Eines der Probleme besteht darin, eine Funktion zu schreiben, um ein int umzukehren (d. H .: 1234 -> 4321, -1234 -> -4321, 2 -> 2, -10 -> -1 etc.).Ein int in OCaml umkehren
Ich habe eine funktionierende Lösung, aber ich bin besorgt darüber, dass es nicht gerade idiomatisch OCaml ist:
let rev_int (i : int) : int =
let rec power cnt value =
if value/10 = 0 then cnt
else power (10 * cnt) (value/10) in
let rec aux pow temp value =
if value <> 0 then aux (pow/10) (temp + (value mod 10 * pow)) (value/10)
else temp in
aux (power 1 i) 0 i
Es funktioniert in allen Fällen, soweit ich das beurteilen kann, aber es scheint nur ernst " un-OCaml "für mich, vor allem, weil ich zweimal mit zwei inneren Funktionen durch die Länge des int renne. Ich frage mich nur, ob es einen "OCaml" Weg gibt, dies zu tun.
Warum nicht int -> string -> char-array -> umgekehrtes char-array -> string -> reversed int? Es ist nicht OCaml, aber ich habe ähnliche Sachen in SML/NJ gemacht (mit implode und explode, was OCaml zu fehlen scheint), während ich mit https://en.wikipedia.org/wiki/Lychrel_number herumspiele. Das Verketten einfacher Transformationen ist in der funktionalen Programmierung ziemlich idiomatisch. Es kann mehrere Durchläufe über die Daten beinhalten, aber "vorzeitige Optimierung vermeiden" ist ein guter Ratschlag beim Erlernen einer Sprache. –
Ich sehe nichts Unordentliches über Ihre Lösung. Es gibt wahrscheinlich einige cleverere Lösungen, aber das ist eine andere Frage. –