D语言中的阶乘

3

我刚开始学习D语言,并试图编写一个简单的阶乘程序。D语言中是否有类似C++中的向量 (vectors)?我想使用向量来创建一个动态函数来计算阶乘。


3
我没有使用过D语言,但你是否参考了文档?在这里的文档中有关于动态数组的说明。请参考。 - narendra-choudhary
2个回答

3
在D语言中,动态数组是可调整大小的,可以像C++中的向量一样进行连接。以下是一个使用此类数组从 stdin 读取并写入到 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
}

关于输入

10

输出结果为:
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

如评论中所述,请参考文档了解有关内置动态数组的更多信息。
然而,您提到的动态函数是不清楚的。通常,我们不需要数组或向量来计算阶乘。请查看RosettaCode以获取在D语言中计算阶乘的其他方法。

@DejanLekic:是的,阶乘实际上是std.range.recurrence的示例之一。然而,由于某种原因,这个问题涉及到数组。 - Gassa

2
为什么不使用std.bigint呢?它针对任意精度数字进行了优化。即使使用ulong2 ^ 64),您也只能计算到20的阶乘,对于这种情况,内联表格可能更合适。以下是使用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
}

如果你想学习更多关于动态数组的知识,也许可以参考DLang Tour的Arrays或者Slices页面,这可能会对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接