Symbol Newtona: Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
CiaPan (dyskusja | edycje)
Anulowanie wersji 58181236 autorstwa Czejar (dyskusja) – poprawność opisu wzoru, nie samego wzoru
Znacznik: Anulowanie edycji
Paweł Ziemian BOT (dyskusja | edycje)
m Zamieniam przestarzały tag 'source' na 'syntaxhighlight'
Linia 125:
Przykładowa procedura w [[Pascal (język programowania)|Pascalu]]:
 
<sourcesyntaxhighlight lang=pascal>
function WspNewtona( n, k : integer ) : integer;
var
Linia 138:
WspNewtona := wynik;
end;
</syntaxhighlight>
</source>
 
Przykładowy predykat w [[Prolog (język programowania)|Prologu]]:
 
<sourcesyntaxhighlight lang=prolog>
silnia(0, 1) :- !.
silnia(1, 1) :- !.
Linia 148:
 
npok(N, K, X) :- silnia(N, X1), silnia(K, X2), NK is N-K, silnia(NK, X3), X is X1 / (X2 * X3).
</syntaxhighlight>
</source>
 
Procedura ta działa szybko i z minimalnym kosztem pamięciowym – wymaga tylko dwu pomocniczych zmiennych (a po dodatkowym usprawnieniu nie potrzebowałaby żadnych). Drobną wadą tego sposobu jest niewielki nadmiar w trakcie obliczeń: maksymalna wartość pośrednia, otrzymana przed ostatnim dzieleniem przez <math>k,</math> jest <math>k</math>-krotnie większa od ostatecznego wyniku. To oznacza, że metody tej nie da się wykorzystać „do granic pojemności” typu całkowitego: maksymalna wiarygodna wartość obliczana tym sposobem zawsze będzie <math>k</math>-krotnie niższa od największej wartości całkowitej dostępnej w danym komputerze, kalkulatorze bądź języku programowania.
 
Poniżej przedstawiona jest procedura [[Rekurencja|rekurencyjna]], pozbawiona tej wady.
<sourcesyntaxhighlight lang=pascal>
function WspNewtonaRek( n, k : integer ) : integer;
begin
Linia 161:
WspNewtonaRek := WspNewtonaRek( n-1, k-1 ) + WspNewtonaRek( n-1, k );
end;
</syntaxhighlight>
</source>
 
Implementacja rekurencyjna bez użycia silni w [[Prolog (język programowania)|Prologu]]:
<sourcesyntaxhighlight lang=prolog>
symbolnewtona(N, K, fail) :- K > N, !.
symbolnewtona(K, K, 1) :- !.
symbolnewtona(N, 0, 1) :- !.
symbolnewtona(N, K, X) :- N1 is N-1, K1 is K-1, symbolnewtona(N1, K1, X1), symbolnewtona(N1, K, X2), X is X1 + X2, !.
</syntaxhighlight>
</source>
 
Ten sposób opiera się wprost na rekurencyjnym wzorze: