我想编写一个通用函数来计算C#中的阶乘......如:
static T Factorial<T>(T n)
{
if (n <= 1)
return 1;
return Factorial<T>(n - 1);
}
但显然有限制我们无法对类型“T
”执行操作。任何替代?
答案 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)
没有简单的方法可以做到这一点。我已经看到一些解决问题的解决方案,但它们相当复杂。也就是说,如果你真的想这样做,这里有一些想法:
如果您可以使用.Net 4,则可以将n
转换为dynamic
,然后执行添加。当然,你失去了安全感 - 你可以在运行时获得一个例外
你总是可以在你的阶乘函数中手动检查类型:如果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);