Dyskusja:Funkcja Ackermanna

message: Witam, 
właśnie zauważyłam, że został usunięty mój kod źródłowy funkcji Ackermanna w Javie. Nie sądzę, że "zbędne. Z tego przykładu nikt się nic nie dowie." jest słusznym uzasadnieniem z tego prostego powodu, że Wikipedia jest public domain, otwartą dla ludzi o różnych poziomach wiedzy. A po drugie jedna osoba nie może wypowiadać się za wszystkie inne. 
Oprócz tego weźmy za przykład stronę niemiecko- i hiszpańskojęzyczną dot. funkcji Ackermanna, które również zawierają kody źródłowe w kilku różnych językach programowania. Obie te strony zostały odznaczone medalem. Nikt nie twierdził, że te kody są zbędne. 
Jeśli twój powód usunięcia przykładu funkcji dla wartości (2,4) jest ten sam, jak powyżej, to to samo co powiedziałam wyżej odnosi się również do tego przykładu. 
Dlatego, dopóki nie znajdziesz lepszego uzasadnienia, umieszczę usunięty kod ponownie na pierwotne miejsce.
Relusion
----
Przepraszam za lapidarność, ale trudno więcej umieścić w uzasadnieniu edycji. No dobrze, spróbujmy zatem wypracować kompromis. Rzeczy, które mi przeszkadzają w tym wpisie: 
* Funkcja main w tym kodzie nie ma wielkiego sensu i tylko wydłuża kod. Zmienne m i n są przecież prywatne i nigdzie nie są inicjowane, więc zawsze będą miały wartość zero. Innymi słowy program zawsze da w wyniku 1. Podobnie niepotrzebne (nic nie wnoszące) jest opakowanie tego w klasę. W wikipedii umieszczana jest tylko pojedyncza funkcja implementująca jakiś algorytm, a nie w pełni funkcjonalny program. Także we wspomnianych przez Ciebie artykułach na niemieckiej i hiszpańskiej wikipedii mamy jedynie pojedyncze funkcje a nie całe programy. I to nie jest moja prywatna opinia, tylko ustalona zasada, zobacz WP:CWNJ#SKŁADNICA, punkt 3. 
* Nazywanie funkcji jednoliterową nazwą nie jest dobrą praktyką programowania, ale rozumiem, że zrobiłaś to po to, żeby potem przykład rozwinięcia mieścił się na szerokość. Ok. To jednak nadal nie tłumaczy, dlaczego jeden z argumentów nazywa się tak samo jak funkcja. Potem w tekście mamy takie fragmenty, jak a(a-1,a(a,b-1)). To zaciemnianie kodu. Poza tym wyżej w tym artykule argumenty funkcji nazywają się m i n, więc lepiej byłoby się tego trzymać. 
* W kodzie brak kontroli dziedziny. Można by jednak dorobić rzucanie jakiegoś wyjątku, bo dla ujemnych wartości wyjdzie nieskończona pętla i przepełnienie stosu. 
* Brak kolorowania składni. 
* Z całego kodu moim zdaniem powinno wyjść coś takiego: 
 static int a(int m, int n) throws IllegalArgumentException
  {
    if (m < 0 || n < 0) throw new IllegalArgumentException();
    if (m == 0) return n+1;
    else if (n == 0) return a(m-1, 1);
    else return a(m-1, a(m, n-1));
  }
replies: text: W tej wersji jednak kod niewiele różni się od pseudokodu umieszczonego w artykule wyżej, stąd moje uzasadnienie. Ale w porządku, samą funkcję, nawet prawie identyczną z pseudokodem akapit nad nią jakoś zaakceptuję. Zacznę usuwać dopiero, gdy ktoś doda kolejną identyczną funkcję w C, a następny opakuje to w klasę i nazwie C++. :-/ 
* Ten przykład rozwinięcia po prostu wydaje mi się za długi. Nawet na niemieckiej i hiszpańskiej wiki, pomimo że artykuły są o wiele dłuższe, to akurat przykłady są krótsze. Jeśli już musiałby być, to może lepiej dla takich parametrów, żeby nie przytłaczał wielkością a artykuł przypominał bardziej encyklopedię, a mniej listing.  
* Nie bardzo ponadto widzę jaką merytoryczną wartość niesie ten przykład. Czy możesz mi to wyjaśnić w inny sposób, niż odwołując się do dowodu społecznego? Bo akurat ten rodzaj dowodu jest rodzajem protezy myślenia, która nie musi mieć nic wspólnego ze słusznością (...miliony much nie mogą się mylić). Bo jeśli koniecznie używać dowodów społecznych, to na przykład podobnej wielkości tablice wartości funkcji (takie, jak tablice rozkładów prawdopodobieństwa) przenosi się zawsze do wikisource. Proszę o jakieś argumenty merytoryczne, dlaczego zajmujące cały ekran rozwinięcie funkcji Ackermanna jest treścią encyklopedyczną, jaką wiedzę lub inną korzyść może ktoś z niego wynieść. 
Pozdrawiam, Olaf @
----
*Odnośnie kodu w Javie: przyjęłam propozycję naniesienia samej metody poszerzonej o exception.
*Odnośnie przykładu funkcji dla wartości (2, 4):
;„Ten przykład rozwinięcia po prostu wydaje mi się za długi. Nawet na niemieckiej i hiszpańskiej wiki, pomimo że artykuły są o wiele dłuższe, to akurat przykłady są krótsze. Jeśli już musiałby być, to może lepiej dla takich parametrów, żeby nie przytłaczał wielkością a artykuł przypominał bardziej encyklopedię, a mniej listing.”
To rozumowanie mogę zaakceptować. Dlatego zmieniłam argumenty w przykładzie.
;„Nie bardzo ponadto widzę jaką merytoryczną wartość niesie ten przykład. Czy możesz mi to wyjaśnić w inny sposób, niż odwołując się do dowodu społecznego? Bo akurat ten rodzaj dowodu jest rodzajem protezy myślenia, która nie musi mieć nic wspólnego ze słusznością (...miliony much nie mogą się mylić). Bo jeśli koniecznie używać dowodów społecznych, to na przykład podobnej wielkości tablice wartości funkcji (takie, jak tablice rozkładów prawdopodobieństwa) przenosi się zawsze do wikisource. Proszę o jakieś argumenty merytoryczne, dlaczego zajmujące cały ekran rozwinięcie funkcji Ackermanna jest treścią encyklopedyczną, jaką wiedzę lub inną korzyść może ktoś z niego wynieść.”
Nie rozumiem twojego ostatniego punktu, ponieważ nigdy nie wspomniałam dowodu społecznego. Najwyraźniej istnieją tutaj dwie kwestie:
1. Czy przykład jest zbyt długi
2. Czy przykład jest zbędny
Odnośnie pierwszej kwestii, nie stanowi ona już problemu, bo zaakceptowałam sugestię zmiany parametrów. Więc przykład jest teraz dość krótki.
A więc pozostaje kwestia 2. Twoja opinia brzmiała: „zbędne. Z tego przykładu nikt się nic nie dowie.“ . Nie sądzę, że to uzasadniony powód do usunięcia czegokolwiek bez dalszego wyjaśnienia, ponieważ każdy może to powiedzieć i usunąć edycje kogoś innego. I oczywiście „miliony much nie mogą się mylić” , ale nie musi też być, że jedna mucha musi mieć rację. A skoro nie twierdzę, że większość nie może się mylić, jest to nieistotne. Z drugiej strony, twierdzenie, że „nikt” nie dowie się niczego z przykładu to reprezentowanie wszystkich czytelników Wikipedii. To twierdzenie jest niemalże niemożliwe do uzasadnienia.
Powtarzając moje stanowisko: Wikipedia jest public domain, z której korzystają czytelnicy o różnych poziomach wiedzy w różnych dyscyplinach. Dobrze sformułowane i względnie proste przykłady są, wydaje mi się, generalnie pomocne w zrozumieniu przedmiotu. Z tego powodu zmieniłam parametry w przykładzie, by stał się on krótszy i prostszy. Mam nadzieję, że niektórym czytelnikom okaże się on pomocny.  
Relusion
----
To że Wikipedia jest na wolnej licencji (BTW, to nie to samo co public domain, ale to tutaj nieistotne), nie oznacza, że trzeba wyznawać absolutny inkluzjonizm. Uznaję jednak Twoje argumenty. W obecnej wersji artykułu wydaje mi się, że osiągnęliśmy kompromis i nie ma po co dalej dyskutować. Na wypadek, gdyby ktoś trzeci chciał wziąć udział w dyskusji, wkleiłem wyżej wcześniejsze wypowiedzi. Pozdrawiam, Olaf @ 19:09, 22 maj 2009 (CEST)
Tak wyglądał kiedyś artykuł o algorytmie Euklidesa. Jeżeli zezwolimy na Javę, to prędzej czy później pojawią się tu implementacje w kilkunastu innych językach. Granicy sensownie nie da się ustalić. Możemy pisać pseudokod obliczający w inny sposób (tzn. rekurencyjnie, iteracyjnie, funkcyjnie, przez programowanie w logice), ale implementacje nie różniące się niczym poza językiem moim zdaniem należy usuwać (niekoniecznie teraz, ale jak dojdzie do eksplozji takiej jak przy algorytmie Euklidesa to owszem). googl d 16:38, 23 maj 2009 (CEST)
To ja mogę dodać argument za dodatkową wersją kodu: optymalizacja. W artykule jest napisane, że tą funkcją można testować optymalizację kompilatorów. W Pythonie możemy mówić tylko o ilości iteracji itp., ale w C ważne jest czy umieścimy funkcję w innym pliku (*.cpp) czy w sekcji przed  int main (ze względu na adresowanie). Przykład:
inline int ack(int m, int n)
{
	if (m == 0) return n+1;
	else if (n == 0) return ack(m-1, 1);
	else return ack(m-1, ack(m, n-1));
}
zadziała trochę inaczej, niż:
extern int ack(int, int);
To pierwsze przykłady, które przyszły mi do głowy. W takim przypadku ważna byłaby większa część kodu, ewentualnie opis. Jakby nie były osobie nie znającej etapów kompilacji sam kod nic nie powie, więc dodatkowe wyjaśnienie byłoby wskazane. Skoro jest już kod w Pythonie, źródło w Perlu czy Ruby nic nie zmieni. Ale w Javie albo C - już tak, bo jest o czym pisać. NullPointerException (dyskusja) 10:17, 24 paź 2014 (CEST)
thread_title:  Funkcja Ackermanna