2017-06-09 1 views
4

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) in const 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 durch 0 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.

+0

Gibt es etwas, das Sie daran hindert, ein Build-Skript zu verwenden? – Shepmaster

+0

Siehe auch [Gibt es eine Möglichkeit, mit Makros zu zählen?] (Https://stackoverflow.com/q/33751796/155423) – Shepmaster

+0

Sie könnten es vielleicht manuell berechnen, aber einen Test schreiben, der die dynamische Berechnung bestätigt? – user25064

Antwort

2

Dies ist noch nicht in der Sprache soweit ich weiß, aber eine proto-RFC exists.

Ich hoffe auch, dass diese Funktion bald kommen wird, denn dies ist ein Mangel für eine Sprache behauptet, es könnte C++ ersetzen.

This Rosetta Code page on compile time calculation zeigt, dass der Compiler kann einige Kompilierungszeit Optimierung tun, aber nichts ist garantiert, und dies ist nur ein Einzelfall.

Verwandte Themen