C#中的通用因子函数

时间:2010-03-09 15:51:09

标签: c# generics

我想编写一个通用函数来计算C#中的阶乘......如:

 static T Factorial<T>(T n)
        {
            if (n <= 1)
                return 1;

            return Factorial<T>(n - 1);
        }

但显然有限制我们无法对类型“T”执行操作。任何替代?

7 个答案:

答案 0 :(得分:7)

问题是泛型不支持运算符,因为它们是静态方法,而不是接口的一部分。但是,您可以使用Generic Operators中提供的Miscellaneous Utility Library

答案 1 :(得分:5)

您需要添加一个执行乘法的委托参数。像这样的东西

delegate T Multiply<T>(T a, T b);

那么你的函数将被定义为:

static T Factorial<T>(T n, Multiply func)
{
    ... your code here
}

因此,当调用阶乘函数时,调用者将传递乘法函数:

int x = Factorial<int>(5, (a,b) => a * b);

答案 2 :(得分:2)

没有简单的方法可以做到这一点。我已经看到一些解决问题的解决方案,但它们相当复杂。也就是说,如果你真的想这样做,这里有一些想法:

  1. 如果您可以使用.Net 4,则可以将n转换为dynamic,然后执行添加。当然,你失去了安全感 - 你可以在运行时获得一个例外

  2. 你总是可以在你的阶乘函数中手动检查类型:如果n是短的,则转为简短,如果n是双精度,则强制转换为双精......等等这很复杂,并且打败了泛型的部分价值,但外部API至少看起来很简单。

答案 3 :(得分:1)

当你最后一次使用字符串或字符的阶乘时? 为什么你需要一个类型为T ????

的阶乘

除此之外已经说过很多(现在已经有100万次)。 当您需要使用泛型时,您需要告诉编译器类型。

例如,如果我有一个通用的堆栈类怎么办? 在创建堆栈时,C#需要知道元素类型。

否则对于:

没有意义
Stack<T> s = new Stack<T>();
s.Push(????); //how do I add items to the stack if we don't know what T is?

相反,您需要指定:

Stack<int> s = new Stack<int>();
s.Push(5);
s.Push(7);

答案 4 :(得分:1)

这并不是专门解决有关使方法具有通用性的问题,但您现有的方法永远不会返回除1以外的任何内容。

假设您只使用整数,它应该如下所示:

static int Factorial(int n)
{
    if (n <= 1)
        return 1;

    // note the multiplication in this step
    return n * Factorial(n - 1);
}

答案 5 :(得分:0)

超级老问题,但我想加2美分。

基本功能需要f* = i

以上示例的快速功能是:

    class FindFactorial
{
    static void Main()
    {
        Console.WriteLine("Please enter your number: ");
        int n = int.Parse(Console.ReadLine()); 

        int factorial = 1;
        for (int i = 1; i <= n; i++)
        {
            factorial *= i;
        }

        Console.WriteLine(factorial);
    }
}

答案 6 :(得分:-1)

 public T Factorial<T>(T a, T b, Multiply<T> delegateMutliply, Difference<T> diffDelegate, BaseCondition<T> baseDelegate)
    {
        if (!baseDelegate(a, b))
            return b;

        return delegateMutliply(a, Factorial<T>(diffDelegate(a), b, delegateMutliply, diffDelegate, baseDelegate));
    }

int y = p.Factorial(3,1,(a,b)=&gt; a * b,(a)=&gt; - a,(a,b)=&gt;(a&lt; = b )?false:true);