Ich möchte die Fakultät eines const
berechnen. Ich möchte mit so etwas Ende:Ist es möglich, eine rekursive Funktion zur Kompilierungszeit in Rust zu berechnen?
const N: usize = 4;
const N_PERMUTATIONS = factorial(N);
Die offensichtlichen Lösungen (die nicht funktionieren) sind:
const fn
– bedingte Anweisungen sind nicht erlaubt (oder zumindest nicht implementiert) inconst fn
, wird weder von der unten kompilieren:const fn factorial(n: usize) -> usize { match n { 0 => 1, _ => n * factorial(n-1) } }
const fn factorial(n: usize) -> usize { if n == 0 { 1 } else { n * factorial(n-1) } }
Makros – Auswertung von Ausdrücken wird nach der Makroerweiterung durchgeführt. Dieses Makro wird nie den Basisfall erreichen, da nach vier Iterationen das Argument
4-1-1-1-1
ist, die durch0
nicht abgestimmt ist:macro_rules!factorial { (0) => (1); ($n:expr) => ($n * factorial($n-1)); }
Ich habe auch versucht die folgenden, die Kurzschluss wenn *
hatte funktionieren würde, Auswertung, sondern als-Rekursion ist bedingungslos hat, die einen Stapelüberlauf ergibt sich: (. als Matthieu M. darauf hingewiesen, können wir Unterschreitung vermeiden durch Verwendung von factorial(n - ((n != 0) as usize))
)
const fn factorial(n: usize) -> usize {
((n == 0) as usize) + ((n != 0) as usize) * n * factorial(n-1)
}
Für jetzt habe ich auf die manuelle Berechnung der Fakultät zurückgegriffen.
Gibt es etwas, das Sie daran hindert, ein Build-Skript zu verwenden? – Shepmaster
Siehe auch [Gibt es eine Möglichkeit, mit Makros zu zählen?] (Https://stackoverflow.com/q/33751796/155423) – Shepmaster
Sie könnten es vielleicht manuell berechnen, aber einen Test schreiben, der die dynamische Berechnung bestätigt? – user25064