Здесь вы идете:
public class MathUtil
{
public int product(int n)
{
if (n < 3) return n; // no need to do any stuff if n is less then 3,
// since the result will be n...
int result = 1; // result must be here
for (int i = 2; i <= n; i++) // start from 2
{
result *= i; // don't need n here
// and you can make it shorter with *=
}
return result;
}
}
Примечание для result
; Допустим, вы вызвали этот метод с n = 3
. result
будет 6
, но он будет установлен таким образом, если его переменная класса, поэтому, когда вы вызываете этот метод с n = 4
после этого для того же экземпляра этого класса, возвращается 146
, и с ним будет установлено result
. Вот почему вам нужно сделать его методом переменной, поэтому его 1
всякий раз, когда вызывается метод, независимо от того, какой экземпляр этого класса.
Кроме того, если вы делаете это переменной класса и устанавливаете в 1
каждый раз, когда вы вызываете этот метод, он все равно может создавать проблемы с синхронизацией, если два потока вызывают этот метод в одном экземпляре этого класса, поэтому избегайте этого (даже если вы не планируете такую вещь, это хорошая практика).
Также отметим, что если результатом является int вы будете переполняться для любого n> 12, и если он длинный, вы переполнитесь, если n> 20 – FredK
@FredK хорошая точка, должным образом отмеченная, спасибо! – janos