Symbol Newtona: Różnice pomiędzy wersjami
[wersja przejrzana] | [wersja przejrzana] |
Usunięta treść Dodana treść
kat. |
Refaktoring przykładów w Javie. |
||
Linia 145:
long symbolNewtona(final long N, final long K)
{
assert
assert
if (N < K)
return 0L;
if (K == 0 || K == N)
return 1L;
if (K == 1 || K == N - 1)
return N;
long wynik = 1L;
try
{
for (long i = 1L; i <= maxK; i++)
wynik = Math.multiplyExact(wynik, (N - i + 1)) / i;
}
Linia 168 ⟶ 175:
Drugi przykład w [[Java (język programowania)|Javie]] daje poprawne wyniki dla dowolnych dodatnich danych wejściowych:
<syntaxhighlight lang=java>
BigInteger symbolNewtona(final
{
assert
assert
if (N < K)
return BigInteger.valueOf(0);
if (K == 0L || K == N)
return BigInteger.valueOf(1);
if (K == 1L || K == N - 1L)
return BigInteger.valueOf(N);
BigInteger result = BigInteger.valueOf(1);
for (long i = 1L; i <= maxK; i++)
result = result.multiply(BigInteger.valueOf(N - i + return result;
}
</syntaxhighlight>
Ta druga metoda jest efektywna czasowo i pamięciowo, jest tylko około trzy razy wolniejsza od wersji poprzedniej. W obu metodach sprawdzane są przypadki szczególne oraz zoptymalizowano liczbę pętli dla <math>K > N / 2</math> korzystając z faktu,
Przykładowy predykat w [[Prolog (język programowania)|Prologu]]:
|