Nie rozumiem... logiki.

Nie rozumiem... logiki.

Wątek przeniesiony 2020-12-07 00:49 z Off-Topic przez cerrato.

AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:19 dni
0
jarekr000000 napisał(a):

@cerrato:

Żadne pętlnie nie są intuicyjne. One są zrozumiałe tylko dla maszyn, a ludzie pracując w kulawych językach programowania nauczyli się je rozumieć (musieli).
Matematycy na pętle generalnie nie wpadli (!!!) - w większości działów matematyki nie ma czegoś takiego jak zmieniający się stan zmiennej (licznik pętli choćby).

Matematycy tak samo musieli wymyślić pętlę, nieskończoną również, tak jak i coś na kształt wyjątku do zawieszenia programu. W ogóle mówienie o braku zmiany stanu w matematyce jest zabawne, gdy cała teoria obliczeń jest oparta o maszynę Turinga, która to modyfikuje stan w miejscu.

jarekr000000
Teoria obliczeń w matematyce ... to informatyka - zresztą dlatego napisałem w większości działów.
AF
Teoria obliczeń to matematyka stosowana. Zresztą trudno oczekiwać, żeby programowanie i teoria języków były gdzieś indziej.
renderme
  • Rejestracja:około 6 lat
  • Ostatnio:około 11 godzin
  • Postów:1461
2

To nie tak źle, że jej nie rozumiesz. Może dzięki temu będziesz miał pokorę i będziesz dążył do czystego kodu.

Kiedyś byłem świadkiem jednej rekrutacji juniorskiej i padły tam słowa: "to zły kandydat. Jest zbyt inteligentny na wiedzę którą ma i może coś zepsuć. Robi spaghetti, bo je rozumie".
Pielęgnuj to, że brzydzisz się zagnieżdzeń, zapętleń - czasami są nieuniknione, ale nie brnij w nie, jak nie musisz.

Ps. To nie jest reguła, ale zwykle takie chamskie zagnieżdzenia for, poza jakąś skrajną optymalizacją nie są dobrą praktyką. Zwykle lepiej już wywołać funkcje/metodę, w której jest kolejne zagnieżdzenie.


Granie w gry i robienie gier ma tyle wspólnego, co uprawianie seksu z pracą ginekologa.
edytowany 1x, ostatnio: renderme
loza_wykletych
loza_wykletych
Ale wywołanie funkcji to narzut. A co jeśli mamy system gdzie wszystkie funkcje są wirtualne? Weźmy takie Obj-C objc_msgSend kosztuje (w najlepszym przypadku) 40 cykli procesora. A jak masz kilka takich zagnieżdżonych wywołań funkcji? Masakra.
renderme
Tak jak mówiłem, poza casami, gdzie jest optymalizacja potrzebna. Jeżeli to backend to taki narzut będzie niewyczuwalny w czasie odpowiedzi na requesta/zuzycia zasobów. We frontendzie taki narzut będzie jeszcze mniej wyczuwalny. W gamedevie już warto się zastanowić czy nagrzewać użytkownikom urządzenie. Jak będą mieli mobilkę, to jeszcze się oparzą i nieszczęście gotowe.
loza_wykletych
loza_wykletych
Nie chciałbym cię oceniać ale w Apple za takie myślenie to kariery byś nie zrobił. W sumie pierwszy iPhone też działał cudem - ale tylko dlatego że Obj-C to podzbiór C i mogli stosować całą jego magię łącznie z cyzelowaniem fragmentów w asm. Ale to było dawno i Jobs dostał raka.
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1
przeh napisał(a):

(…) przez rozumowanie logiczne rozumiem łączenie ze sobą faktów, a w tym przypadku zmiennych. Nie rozumiem jednak dodawania przed pętlą albo w pętli jakiejś abstrakcyjnej zmiennej, która jest pusta, żeby później w iteracji trzeba było do niczego dodać coś.

Hm… rozumiem.

Co do mnie, nie pamiętam, czy miałem jakieś problemy z pętlami, czy nie, gdy zaczynałem naukę programowania. Aktualnie idę w stronę rekurencji, ale polecać Ci jej nie będę. Nadal mam z tyłu głowy, że łatwiej w niej popełnić w niej błąd (logiczny) niż w takiej zwykłej pętli. Choć przyznam, że tego problemu, o którym napisałeś, nie ma wydaje się nie być w funkcjach korzystających z rekurencji – przynajmniej w znanych mi językach.

Może dobrym punktem wyjścia będą dla Ciebie funkcje typu forEach czy map (obecne np. w JavaScript'cie). Operują one na "kolekcjach" – wykonują daną operację raz dla każdego elementu kolekcji. Są one bardziej intuicyjne od rekurencji oraz zwykłej pętli według mnie. Czasem też łatwiej pisać za ich pomocą kod zwięzły logicznie.


edytowany 5x, ostatnio: Silv
renderme
forEach bardziej intuicyjny? ło Panie, to jak rozważanie, czy w samochodzie kierownica w kolorze brązowym jest bardziej intuicyjna od czarnej. w forEach przeciez przekazuje sie callback, gdzie domyslnymi argumentami jest wartosc i własnie id (i pare innych rzeczy). Niby w czym jest to prostsze od instrukcji for?
Silv
Mmm w założeniu bardziej intuicyjne. (A np. to, jakie parametry przekazujemy, to szczegół implementacyjny).
stivens
Najczesciej wystarczy wartosc i nie ma zadnego id.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 10 godzin
  • Postów:3277
2

Dobre, autor pisze, że nie kuma pętli a wy o matematyce, składni konkretnych języków i nie wiadomo czym jeszcze... Spróbuję po swojemu.
Problem:
Czasami pisząc program trzeba wykonać jakiś kawałek kodu więcej niż 1 raz. Żeby nie utknąć w samym algorytmie przykład kompletnie abstrakcyjny - mamy wypisać wszystkie liczby z przedziału 0..9. kod wyglądałby tak:

Kopiuj
drukuj 0
drukuj 1
drukuj 2
drukuj 3
drukuj 4
drukuj 5
drukuj 6
drukuj 7
drukuj 8
drukuj 9

To co widać wyżej zadziała, ale trzeba pisać dużo kodu, co z jednej strony jest czasochłonne, z drugiej łatwo się pomylić, a czasami będzie niemożliwe (np. dla przedziału 0..1000000).
Żeby jakoś rozwiązać te niedogodności, języki programowania odpowiadają na tę potrzebę poprzez umożliwienie zapętlania kodu, w najprostszym wydaniu wygląda to tak:

Kopiuj
licznik := 0 //przypisz licznikowi wartość 0

#hop //po prostu miejsce w kodzie, oznaczenie miejsca, do którego program może skoczyć
drukuj licznik
licznik := licznik + 1 //zwiększ wartość licznika o 1
jeżeli licznik <= 9 to skocz do #hop

Czyli mamy kod do wykonania, jakiś warunek i jeżeli ten warunek jest spełniony, to program ma skoczyć w określone miejsce (cofnąć się do początku bloku pętli. W "normalnym" kodzie można do tego użyć pętli for:

Kopiuj
for(<coś co ma być wykonane przed wejściem w pętlę>; <warunek skoku>; <coś co ma być wykonane po każdym skoku>){
  <instrukcje, które maja być wykonane w każdym przebiegu pętli>
}

Czyli właściwy kod, przy użyciu pętli for będzie wyglądał tak:

Kopiuj
for(int licznik = 1; licznik <=9; licznik = licznik +1){
  print(licznik);
}

Teraz zmieńmy zadanie - wypiszmy każdą możliwą kombinację cyfr 0..9: 0-0, 0-1 ... 9-9. Zrobimy to dzięki temu, że częścią instrukcji wykonywanych w pętli może być kolejna pętla:

Kopiuj
for(int licznik = 1; licznik <=9; licznik = licznik +1){
  for(int drugiLicznik = 0; drugiLicznik <= 9; drugiLicznik = drugiLicznik + 1){
     print(licznik+"-"+drugiLicznik);
  }
}

W każdym z 10 przebiegów głównej pętli wykonywane jest 10 przebiegów pętli wewnętrznej i to jest cała tajemnica "podwójnej pętli". Warto pamiętać, że pętle nie mogą się "przecinać". Dodatkowo, oprócz pętli for z licznikiem mogą być używane inne konstrukcje: while, do..while, które czasami pozwalają na prostsze zapisanie konkretnych algorytmów.

Silv
Na pomysł wpadłem po tym poście: może historia pętli/rekurencji w językach programowania od początku (z przykładami) przydałaby się @przeh . (Sam też chętnie bym poczytał).
gk1982
nic nie rozumie z tego
Silv
@gk1982: @piotrpo w bardzo skróconej wersji podał historię pętli, przynajmniej ja tak to widzę…
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)