Dyskusja:Trójkąt Pascala

message: Wyjątkowo nieefektywny algorytm. Delikatnie mówiąc, pomysł obliczania elementów trójkąta przez współczynniki Newtona nie jest najszczęśliwszy - jeśli już, należało użyć innego wzoru na współczynnik, który zamiast 3 silni wymaga obliczenia dwóch. Znacznie lepszy algorytm uzyska się korzystając z własności opisanej w pierwszym wierszu pod trójkątem: dany element jest sumą dwóch znajdujących się nad nim. Program w Pythonie, który to robi jest w artykule na en i zajmuje 6 wierszy... Pewnie jest niewydajny pamięciowo, ale i to daje się obejść zapamiętując tylko ostatnio obliczony wiersz współczynników. WojciechSwiderski 06:30, 13 gru 2004 (CET)
replies: text: Algorytm jest nie tylko nieefektywny (trzykrotne obliczanie silni – jeśli już, to "dedykowana" procedura powinna wszystkie trzy potrzebne wartości wyliczyć w jednym podejściu), ale do tego jeszcze zupełnie niepotrzebnie (a co gorsza: niejawnie!) ograniczony zakresem dopuszczalnych wartości. Na przykład licząc całkiem niewielki współczynnik
replies: text: :(20 po 6)=38760

text: musi pomocniczo wyznaczyć wartość
replies: text: :20! = 2 432 902 008 176 640 000

text: (o 14! nie wspominając), co normalnym kompilatorom po prostu nie zmieści się w typie int.

text: Popieram Wojciecha – podany program to medalowy przykład programistycznej niekompetencji. Publikowanie takich "przykładów" powinno być karalne. Tożsamości matematycznych nie wolno bezmyślnie przekładać na kod programu. Jeśli programista ma szczęście, to to po prostu nie zadziała (poza przypadkami trywialnymi). A jeśli ma pecha, to program będzie udawać, że działa, aż do czasu, gdy będzie naprawdę potrzebny. Wtedy się wyłoży z trzaskiem, jak silnia dwudziestu. CiaPan 11:07, 13 gru 2004 (CET)
Inkryminowany kod (12:21, 14 gru 2004 (CET) zastąpiony nowym).

#include <iostream.h>
#include <stdlib.h>
//----------------------------------------------------------------
// Deklaracja zmiennych
int rzedow;
// Deklaracja funkcji
int silnia (int n);
int symbolNewtona (int n, int k);
int main(int argc, char* argv[])
{
        cout << "Ile rzedow ?" << endl;
        cin >> rzedow;
        cout << endl;
        for (int i = 0; i < rzedow ; i++)
        {
                for (int j = 0; j < i+1; j++)
                {
                        cout << symbolNewtona(i, j) << " ";
                }
                cout << endl;
        }
        system("PAUSE");
        return 0;
}
//----------------------------------------------------------------
int silnia (int n)
{
        int pom = 1;
        if (n == 0)
                return 1;
        else
        {
                for (; n > 1; n--)
                {
                        pom *= n;
                }
                return pom;
        }
}
//----------------------------------------------------------------
int symbolNewtona (int n, int k)
{
        return silnia(n)/(silnia(k)*silnia(n-k));
}
//----------------------------------------------------------------

CiaPan 12:21, 14 gru 2004 (CET)
Dzięki Trójkątowi Pascala można, także z łatwościa obliczyc dowolna potęge 11.

0                   1                11^0 = 1
1                 1   1              11^1 = 11
2               1   2   1            11^2 = 121
3             1   3   3   1          11^3 = 1331
4           1   4   6   4   1        11^4 = 14641
5         1   5  10  10   5   1      
5         1   6   1   0   5   1      11^5 = 161051
6        1  7   7   1   5   6   1    11^6 = 1771561
10                                   11^10 = 25937424601
         ........................
100                                  11^100 = 85160166587360500976807846054026496903192088306676965392310691532774
                                                                                8634992076769401159497458526446001


message: Ciekawe, ale już spisywanie współczynników nie działa już dla potęgi >= 5, a inna reguła nie została explicite podana. [[Wikipedysta:WojciechSwiderski|WojciechSwiderski]] 22:21, 29 sty 2005 (CET)

message: Pomylilem sie... ale juz wszystko naprawilem :)
replies: text: Nadal nie rozumiem jak to działa. A Ty po prostu przywróciłeś wycięty fragment. WojciechSwiderski 08:05, 30 sty 2005 (CET)
Do 11^4 wszystko jak sadze jest jasne. Dale postepujemy tak samo dla wartosci mniejszych o 10. Dla wiekszych lub rownych zostawiamy reszte z dzielenia przez 10 a do nastepnego elementu dodajemy 'ilosc dziesiatek'. Czyli dla 10^5 yglada to tak:
10^4      1   4   6   4   1
10^5    1   5  10  10   5    1
                    |   |    |
                    |   |    |--- Tu normalnie przepisujemy.
                    |   |
                    |   |-------- Tu normalnie przepisujemy.
                    |
                    |------------ 10%10 == 0, wiec costawiamy w tym miejscu 0 a do nastepnego elementu dodajemy 1 
                                                                                                           i mamy:
10^5    1   5  11   0   5    1
                |
                |---------------- 11%10 == 1, wiec zostawiamy w tym miejscu 1 a do nastepnego elemetnu dodajemy 1 
                                                                                                           i mamy:
10^5    1   6   1   0   5    1
i koniec. 10^5 == 161051 :). Zgadza sie? ;>
thread_title:  No tak :/ 

message: Weź rząd n.
Wypisz liczby w słupku tak jak przy mnożeniu pisemnym (z jednym przesunięciem).
Dodaj w kolumnach.
np.
11^5
              1
             5
           10
          10
          5
+        1
----------------
         161051
thread_title:  obliczanie 11^n 

message: na http://www.dejaview.cad.pl/liczby_fraktalne.php jest applet w javie ktory generuje trojkaty wspolczynikow dwumiennych ale i liczb stirlinga I, II  w MODULO
ja sie zbytnio nie orientuje jak dodac ladnie linka, jakby ktos chcial to pewnie sie przyda zainteresowanym
thread_title:  Trójkąty Pascala i inne w modulo 

message: Poprawiłem algorytm w PAscalu.
Teraz działa lepiej.
Czyli poddalem do rekurencji drugi składnik dla k=1 lub n-1.
Bez tego program w Delphi sie gubił nie miał 2 składników do rekurencji. Zapętlał się zmieniając wartośc n na ujemne.
Proponuje wymienic algorytm na lepszy.
function pascal(n,k:byte):word;
var
rob,i,j: word;
begin
rob:=1;
  if (k=0) or (k =n) then
     rob := 1
  else
  if (k=1) or (k=n-1) then
  rob:=n
  else
    rob := pascal(n-1, k-1) + pascal(n-1,k);
    pascal:=rob;
end;
----
Wprowadzenie zmiennej pomocniczej nic nie zmienia. Pogarsza tylko procedurę, dodatkowa zmienna obciąża stos i dlatego program przepełni stos dla mniejszej wartości n.
Jeżeli procedura zostanie wywołana z nieprawidłowymi wartościami, to oczywiście wywali się. Pomimo tego usunąłem kod sprawdzający, procedura wykonująca się rekurencyjnie sprawdzać będzie warunek przy każdym wywołaniu funkcji, a to jest wyjątkowo nieefektywne. W praktycznej realizacji funkcję można "obudować" funkcją sprawdzającą zakresy n i k i wywołującą tę funkcję, ale to jest pokaz przekształcania wzoru matematycznego na kod i tyle wystarczy. 
 
StoK (dyskusja) 18:49, 7 gru 2007 (CET)
thread_title:  Poprawa algorytmu w Pascalu 

message: Usunąłem kody źródłowe programów w C++, gdyż moim zdaniem:
# bez sensu jest zapychanie artykułu o pojęciu matematycznym kodami programów tej wielkości,
# pierwszy kod miał ograniczenie ilości rzędów,
# drugi obliczał poszczególne za pomocą silni, co jest całkiem nieefektywne i też ogranicza wielkość trójkąta,
# po co aż dwa kody? (Wikipedia to nie pastebin),
# ... i skoro chodzi głównie o pokazanie algorytmu, to po co pokazywać w artykule wszystkie wewnętrzne śmieci C++?
Mam nadzieję, że autorzy tych kodów sie na mnie nie obrażą. Podrawiam, mik01aj (dyskusja) 20:26, 16 lis 2008 (CET)
replies: text: PS. Chodzi o tę edycję. mik01aj (dyskusja) 20:32, 16 lis 2008 (CET)
thread_title:  Kody źródłowe 

message: Jakby to wyglądało, gdyby utworzyć trójwymiarowy model tego trójkąta, o podstawie czworokąta najlepiej foremnego?
I czy to matematycznie poprawne?
thread_title:  3D