die Lösung, die Brian vorschlägt, ist definitiv die beste Option (in F #). Mithilfe von Sequenzausdrücken können Sie leichter ausdrücken, was Sie meinen. Warum also nicht verwenden?
Wie auch immer, wenn Sie dies tun, nur als Übung, dann können Sie die verschachtelte Schleife als einzelne rekursive Funktion und die äußere Schleife als zweite neu schreiben (wie Imagist schon sagt):
let product =
let rec outer(n1) =
let rec nested(n2) =
if n2 > 4 then [] else (n1 * n2)::(nested(n2 + 1))
if n1 > 4 then [] else nested(2) @ outer(n1 + 1)
outer(2)
Ich bin Verwenden von :: in der verschachtelten Funktion zum Anhängen von Elementen an den Anfang und @ zum Verketten von Listen, die von einzelnen verschachtelten Funktionsaufrufen generiert wurden. Die Verwendung von @ ist nicht sehr effizient, und der Code ist auch nicht Schwanz-rekursiv, so bessere Version Akkumulator Parameter verwendet würde wie folgt aussehen:
let product =
let rec outer n1 acc =
let rec nested n2 acc =
if n2 > 4 then acc else nested (n2 + 1) ((n1 * n2)::acc)
if n1 > 4 then acc else outer (n1 + 1) (nested 2 acc)
outer 2 [] |> List.rev
hoffte, das hilft!
Ich weiß nicht, F #, aber ich kenne andere funktionale Sprachen, und ich kann ein wenig Ratschlag bieten: Konvertieren Sie die innere (mehr verschachtelte) Schleife in eine rekursive Funktion zuerst. Dann sollte es einfacher sein, die äußere Schleife in eine rekursive Funktion umzuwandeln, die die innere Schleifenfunktion aufruft. – Imagist