Bitte beachten Sie, ein C-Programm, das, x
gegeben, kehren y
und z
so dass y + z * 2 = x
, für die kleinstmögliche y
. Grob gesagt, ich könnte eine verschachtelte Schleife erstellen:Verschachtelte Schleife und funktionale Programmierung
for(y = 0; y < x; ++ y){
for(z = 0; z < x; ++z){
if(y + 2 * z == x){
printf("%d + 2 * %d = %d", y, z, x);
}
}
}
Wie konnte ich diese Art von verschachtelter Schleife in übersetze die funktionelle Art und Weise? Ist es machbar? Ist es vernünftig oder verurteile ich nur den Ansatz? Mein bester Versuch so weit:
let foo x =
let rec aux (y, z, q) =
match (y + z * 2) with
r when r = q -> (y, z)
|_ -> aux(y + 1, z + 1, q) //How to check different values of z
aux(0, 0, x) //for each value of y?
Es wird nicht funktionieren, da es sowohl nur y
und z
erhöht wird. Wie kann ich verschiedene Werte von z für jeden Wert von y überprüfen?
Prozedursprachen (wie C) und eine funktionale Sprache (wie F #) repräsentieren zwei verschiedene Paradigmen, wenn es um die Programmierung geht. Als solche können Sie nicht wirklich direkte Übersetzungen zwischen ihnen machen (naja, Sie * können * aber es werden keine guten Übersetzungen sein, sehr wahrscheinlich eher das Gegenteil), Sie müssen oft * anders * denken *. –
Wie für die Frage im Kommentar Ihres funktionalen Ausschnitts -> verwenden Sie eine zweite rekursive Funktion. –
unter der Annahme, dass es sich um vorzeichenlose Ganzzahlen handelt, warum berechnen Sie das Ergebnis nicht direkt? 'y = x% 2; z = x/2' würde tun .... (und kann in Funktionscode ausgedrückt werden) –