2016-07-28 15 views
2

Ich habe gerade mit D begonnen und versuchte, ein einfaches Fakultätsprogramm in D zu schreiben. Gibt es etwas wie Vektoren von C++ in D? Ich wollte Vektoren verwenden, um eine dynamische Funktion zur Berechnung von Fakultät zu erstellen.Fakultät in D Sprache

+3

Ich habe D lang nicht verwendet, aber haben Sie auf die [Dokumentation] (https://dlang.org/spec/spec.html) verwiesen? Es sagt etwas über dynamische Arays [hier] (https://dlang.org/spec/arrays.html#dynamic-arrays) in der Dokumentation aus. –

Antwort

2

In D sind dynamische Arrays in der Größe veränderbar und können wie Vektoren in C++ verkettet werden. Hier ist ein Beispiel mit einer solchen Anordnung, die aus stdin liest und schreibt zu stdout:

import std.stdio; // for readf and writeln 

void main() // void for main means "int with return 0 at exit" to OS 
{ 
    int n; 
    readf (" %s", &n); // skip whitespace, then read int in default format 
    auto f = [1]; // a dynamic array of int containing a 1 
    foreach (i; 1..n + 1) // for i = 1, 2, 3, ..., n - 1, n 
    { 
     f ~= f[$ - 1] * i; // append to f its last element multiplied by i 
    } 
    writeln (f); // print the dynamic array in default format 
} 

Für Eingangs

10 

die Ausgabe ist:

[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800] 

Wie in den Kommentaren erwähnt, Weitere Informationen zu integrierten dynamischen Arrays finden Sie unter the documentation.


Es ist jedoch nicht klar, was eine dynamische Funktion Sie erwähnen. Und im Allgemeinen brauchen wir kein Array oder Vektor, um faktoriell zu berechnen. Überprüfen Sie RosettaCode für ein paar andere Ansätze zur Berechnung von Fakultät in D.

+0

Perfekter Kandidat für eine Reihe (Generator) ... – DejanLekic

+0

@DejanLekic: Ja, Fakultät ist in der Tat eines der Beispiele für [std.range.recurrence] (https://dlang.org/library/std/range/recurrence .html). Die Frage bezog sich jedoch aus irgendeinem Grund auf Arrays. – Gassa

2

Warum verwenden Sie nicht std.bigint? - Es ist für Numerik mit beliebiger Genauigkeit optimiert. Selbst mit ulong (2^64) können Sie nur faktoriell bis 20 berechnen und für diesen Anwendungsfall könnte eine Inline-Tabelle sinnvoller sein. Hier ist ein Beispiel mit BigInt:

import std.bigint : BigInt; 

BigInt factorial(int n) 
{ 
    auto b = BigInt(1); 
    foreach (i; 1..n + 1) 
     b *= i; 
    return b; 
} 

void main() 
{ 
    import std.stdio : writeln; 
    factorial(10).writeln; // 3628800 
    factorial(100).writeln; // 9.33 * 10^157 
} 

Wenn Sie mehr über dynamische Arrays lernen, vielleicht die DLang Tour-Seiten für Arrays oder Slices könnten Ihnen helfen?