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

Nie rozumiem... logiki.

1

Hej, to dość dziwne pytanie ale zaczynam właśnie swoją drogę w Pythonie i nie potrafię zrozumieć do końca pętli w pętli. Trochę wystawiam się świadomie na pośmiewisko ale trudno. Samo założenie pętli rozumiem. Jak również pętle 'while' i w miarę 'for'. Natomiast jak mam pętle podwójną 'for' to już nie ogarniam tego zupełnie. Co ciekawe tryb logiczny jest do tej pory dla mnie najprostszy. Moje pytanie brzmi jeśli nie rozumiem tego w tym momencie, mimo, że próbuję samemu wykonywać ćwiczenia ale mi nie wychodzi, to czy warto w to dalej brnąć. Czy da się wyuczyć rozumowania logicznego?

13

Po pierwsze - może korzystałeś z kiepskiego kursu albo masz słabego nauczyciela. Albo nawet nie tyle słabego, co takiego, z którym nie nadajecie na wspólnych falach.

Po drugie - zawsze na początku nawet proste rzeczy wydają się trudne. Pamiętam, jak podczas mojej pierwszej jazdy L na mieście nie byłem w stanie jednocześnie skręcać, ruszać ze świateł i jeszcze biegu zmienić :D Jeśli będziesz siedział w programowaniu kilka tygodni/miesięcy i nadal nie obczaisz jak działa pętla to wtedy już będzie większy problem.

Po trzecie - jak możesz to wrzuć tu ten problematyczny kawałek, na pewno razem dojdziemy do tego, jak on działa :)

32

Pętla w pętli:

Podskocz 10 razy
Po każdym podskoku 10 razy klaśnij
Koniec.

4

Zwykłe pętle for są nieintuicyjne, nielogiczne i niezgodne z naturą.
Dlatego masz z nimi problem.

Może łatwiej Ci będzie zrozumieć pętle for-each.
Tu przykład z wyświetleniem macierzy 4 x 3:

    from array import *
     
    T = [[11, 5, 2], [15, 6,10], [10, 12, 5], [15, 8, 6]]
     
    for row in T:
        for value in row:
            print(value, end = " ")
        print()

https://ideone.com/ohjU7B

0

Nie znam Pythona. Co rozumiesz przez "rozumowanie logiczne"?

0

Zwykłe pętle for są nieintuicyjne, nielogiczne i niezgodne z naturą.

@vpiotr - nie zgadzam się. Dla mnie to jest najprostsza z możliwych konstrukcji. Mówisz programowi, że ma dany kawałek wykonać X razy i on po prostu to robi :P Nawet podany przez Ciebie przykład wykonuje się dokładnie tak, jakbym tego oczekiwał. Czy możesz wyjaśnić, co tam jest nielogicznego i nieintuicyjnego? Dla mnie pojmowanie pętli jest dokładnie takie, jak napisała @Freja Draco - każesz ileś-tam razy (albo wpisane na sztywno od 1 do 10, albo jak u Ciebie - tyle razy, ile jest w jakiejś tablicy) wykonać daną czynność.

1

Prosty przykład:
Mamy arkusz kalkulacyjny, w każdej komórce chcesz wpisać wartości numer rzędu oraz nazwa kolumny. Interesuje nas pierwsze 10 rzędów oraz 10 kolumn.
Jaki algorytm masz zastosować? Pewnie coś ala:

Dla rzedu od 1 do 10
Dla wiersza od A do G
Wez aktualny rzad oraz wiersz oraz wpisz taką parę w komórkę

Jasne? To teraz bliżej języka komputera (nadal pseudo-kod):

for rzad = 1 to 10
for wiersz = A to G
print(rzad + wiersz)

Boom mamy to

2

Weź swoją ulubiona herbatę i zrób sobie 4 garnki tej herbaty. Po 3 torebki herbaty na garnek..
Wprowadź sobie jednak dodatkowe utrudnienie. Mianowicie: "W danej chwili maksymalnie 1-a torebka może znajdować się poza opakowaniem lub koszem."
Zrozumiesz, czym jest for we forze.

3

@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 mają rekrursję (i powiązaną indukcję). Rekursja to generalnie jedyny sposób robienia pętli językach "matematycznych" (funkcyjnych). I jest to zupełnie praktyczne i "turing complete".
Najśmieszniej to wygląda jak studenci uczą się algorytmów w jakiś językach imperatywnych, a potem piszą matematyczne dowody poprawności używając indukcji :/ A w językach funkcyjnych mamy to podane wprost (ale może wtedy nie było zabawy...)

0

@jarekr000000: nie wiem, co niezrozumiałego jest w poleceniu weź odlicz od 5 do 10 i za każdym razem wypisz tyle gwiazdek na ekranie, jaką wartość ma aktualny przebieg funkcji. Zresztą nawet porównując to do prawdziwego życia (nie chodzi o matematykę, ale o takie codzienne czynności) chyba łatwiej jest powiedzieć komuś weź 10 zgrzewek wody gazowanej i przenieś z bagażnika do schowka przy kuchni niż bawić się w rekurencję.

4
cerrato napisał(a):

chyba łatwiej jest powiedzieć komuś weź 10 zgrzewek wody gazowanej i przenieś z bagażnika do schowka przy kuchni niż bawić się w rekurencję.

zgrzewkiWodyGazowanejWBagazniku.take(10).moveTo(schowekPrzyKuchni) - ja tu nie widzę ani pętli, ani rekurencji :P

2

@cerrato:
weź odlicz od 5 do 10 i za każdym razem wypisz tyle gwiazdek na ekranie, jaką wartość ma aktualny przebieg funkcji. - ja tego nie rozumiem. Co to jest wartośc przebiegu funkcji? w kilometrach?

Pętle (w tym forEach) wiążą się z mutacjami i efektami ubocznymi. Wiem, że większość z nas jest do tego przyzwyczajona, ale ja do dziś pamiętam mój pierwszy dzień z komputerem i szok jak zobaczyłem zapis:
x = x + 1. (to był BASIC)

Potem się do tego przyzwyczaiłem, ale obecnie znowu uważam to za słaby koncept (samo nadpisanie zmiennej, nieważne jaki tam jest znaczek).

2

@jarekr000000:
Jak dla mnie przez 10 dni codziennie powtarzaj te 10 słów jest bardzo intuicyjne a to jest for w forze

1

@scibi92:

przez 10 dni codziennie powtarzaj te 10 słów jest bardzo intuicyjne a to jest for w forze

Proponuję ćwiczenie - napisać program, który to robi. Oczywiste jest, że ma to robić przez 10 dni. Program może użyć konsoli zamiast ust.
Btw. nie mam pojęcia jaki będzie wynik tego eksperymentu :-) Po prostu .. przyszło mi do głowy, że to może być całkiem nietrywialne. Nie będzie też specjalnie żmudne, ale ciekawe czy wyjdzie for w forze.

0

Nie martw się. Kiedyś ludzie o to samo pytali przy instrukcji goto. Była wszędzie i dawała radę. Ale ponieważ nikt normalny nie rozumie zasady działania maszyny Turinga to dzisiaj idziemy funkcyjnie. Za 10 lat pętle będą tam gdzie dzisiaj jest goto.

4

Po ścianie oftopu wracając do tematu ;p.
Myślę, że tu też występuje problem dzielenia problemów na mniejsze i idącego za tym tez w drugą składania kawałku kodu w zrozumiały dla człowieka byt. Chyba każdy, kto już trochę popracuje z kodem intuicyjnie „rozpracowuje” co dany kawałek kodu robi, a jeżeli już ten kawałek kodu jest bardzo skomplikowany. To automatycznie skupiamy się na zrozumieniu pojedynczej linijki i przejścia od szczegółu do ogółu. ( i w drugą stronę przy tworzeniu od ogółu do szczegółu).

Natomiast dużo początkujących dostaje kawałek kodu i blednie, bo nie potrafi przeczytać co jest napisane. A jak poprowadzisz za rączkę po fragmencie takiego delikwenta. Typu co oznacza ten if co robi ta petla itd itd itd. to nagle okazuje się, że jednak potrafi to odczytać tylko nie potrafi do tego podejść. I w drugą stronę dostają takie osoby problem i nie potrafią go zrobić, bo nie potrafią podzielić tego na mniejsze kawałki i od razu próbują wyobrazić sobie całość kodu noi kończy sie ram w głowie i dupa.

Takżę @przeh tu nie problemem jest brak logiki ale obycia się z kodem. (oczywiście poza nauką składni i mechanizmów bo bez tego ani rusz).
Na początek polecam www.codewars.com albo inna tego typu stronke gdzie jest dużo zadań od banalnych do bardziej rozbudowanych.

0

@przeh tu nie problemem jest brak logiki ale obycia się z kodem. (oczywiście poza nauką składni i mechanizmów bo bez tego ani rusz).
Na początek polecam www.codewars.com albo inna tego typu stronke gdzie jest dużo zadań od banalnych do bardziej rozbudowanych.

Według mnie python nie jest dobrym językiem na początek. Lepszym wyborem była by java, pascal, c czy choćby php

1
przeh napisał(a):

pętle podwójną 'for' to już nie ogarniam tego zupełnie. Co ciekawe tryb logiczny jest do tej pory dla mnie najprostszy. Moje pytanie brzmi jeśli nie rozumiem tego w tym momencie, mimo, że próbuję samemu wykonywać ćwiczenia ale mi nie wychodzi, to czy warto w to dalej brnąć. Czy da się wyuczyć rozumowania logicznego?

Zrób sobie proste przykłady które możesz robić i na komputerze i długopisem na kartce w kratkę

/sorry, w pythonie nie piszę, ale pętle w js powinieneś zrozumieć. console.log() to odpowiednik print/

Pierwsze, "narysuj" trójkąt

cat triangle.js && node triangle.js 
for (let i = 1; i <= 7; i++) {
    let line = ""
    for (let j = 0; j < i; j++) {
        line = line + "x"
    }
    console.log(line)
}
x
xx
xxx
xxxx
xxxxx
xxxxxx
xxxxxxx

Jak już zrozumiesz na kartce i w kodzie trójkąt, zrób sobie choinkę

cat triangle.js && node triangle.js 
const treeHeight = 5;
for (let i = 1; i <= treeHeight; i++) {
    let line = ""
    for (let j = 0; j < treeHeight - i; j++) {
        line += " "
    }
    for (let j = 0; j < 2 * i - 1; j++) {
        line += "*"
    }
    console.log(line)
}

for (let i = 0; i < 3; i++) {
    let line = ""
    for (let j = 1; j < treeHeight; j++) {
        line += " "
    }
    line += "X"
    console.log(line)
}
    *
   ***
  *****
 *******
*********
    X
    X
    X

Dla zabawy i wprawy na koniec zrób 3 pętle, z choinek zrób las

cat forest.js && node forest.js 
const numberOfTees = 7;


for (let tree = 1; tree <= numberOfTees; tree++) {
    for (let i = 1; i <= tree; i++) {
        let line = ""
        for (let j = 0; j < numberOfTees - i; j++) {
            line += " "
        }
        for (let j = 0; j < 2 * i - 1; j++) {
            line += "*"
        }
        console.log(line)
    }

    for (let i = 0; i < 3; i++) {
        let line = ""
        for (let j = 1; j < numberOfTees; j++) {
            line += " "
        }
        line += "X"
        console.log(line)
    }

    for (let j = 0; j < 3; j++) {
        console.log()

    }
}
      *
      X
      X
      X



      *
     ***
      X
      X
      X



      *
     ***
    *****
      X
      X
      X



      *
     ***
    *****
   *******
      X
      X
      X



      *
     ***
    *****
   *******
  *********
      X
      X
      X



      *
     ***
    *****
   *******
  *********
 ***********
      X
      X
      X



      *
     ***
    *****
   *******
  *********
 ***********
*************
      X
      X
      X

PS
W konsoli pieniek z konarami się nie rozjeżdża. W konsoli przeglądarki rozjechało się.

1

@cerrato: TL;DR

Abstrahując od tego co napisał @jarekr000000 (co jednak ma znaczenie dla tego co chcę przekazać) to podaję przykład:

10 FOR l = 2 TO 8 STEP 2
20 PRINT l; ", ";
30 NEXT l
40 PRINT "Who do we appreciate?"

https://rosettacode.org/wiki/Loops/For_with_a_specified_step#ZX_Spectrum_Basic

Pytania po zobaczeniu tego pierwszy raz:

  • co to jest I?
  • po co mi step 2?
  • dlaczego NEXT I a nie po prostu NEXT?
  • czy jak dodam drugie NEXT I to mi się 2x zwiększy zmienna?
  • wartość I zwiększa się w NEXT czy w FOR?
  • dlaczego nie mogę użyć wartości I za pętlą? a może mogę?
    itd itp

For (także, albo przede wszystkim w C/C++/Javie) ma tak dziwny zapis że wielu ludzi woli robić pętle while zamiast for (cos jak skręcanie tylko w prawo).

0

@vpiotr: no ale dałeś przykład jakiegoś kosmosu, rzeczywiście - trudno ocenić, co robi next i kiedy następuje zmiana zmiennej sterującej. Tylko ten przykład nie ma za wiele wspólnego z typowym for w stylu for x=1 do 30 rób XXX.

1
cerrato napisał(a):

@vpiotr: no ale dałeś przykład jakiegoś kosmosu, rzeczywiście - trudno ocenić, co robi next i kiedy następuje zmiana zmiennej sterującej. Tylko ten przykład nie ma za wiele wspólnego z typowym for w stylu for x=1 do 30 rób XXX.

typowy for używa zmiennej x w rób XXX, czasem też x - 1.

0
vpiotr napisał(a):

typowy for używa zmiennej x w rób XXX, czasem też x - 1.

Ale chyba wtedy nie ma problemu z tym, jaką wartość ma taki X, kiedy się zmienia ani jak przebiega wykonanie pętli. Jedynie dobrze jest nie zmieniać wprost wartości zmiennej sterującej i wszystko jest jasne.

3

Wiecie co to jest pętla nieskończona? To pętla, którą ktoś zapomniał dokończyć.
Przykład:

int x = 0;
while (x<30) {
  kotek  k = weźKotka();
  młotek m = weźMłotka();
  m.walW(kotek);
}
//autor kodu nie skończył pisać i nie dopisał x++ na końcu -> klasyka
1
jarekr000000 napisał(a):

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 mają rekrursję (i powiązaną indukcję).

Ależ wpadli. Reguły pętli nieskończonej są w zasadzie zawarte w samej aksjomatyce liczb naturalnych. Definiuje ona element początkowy i pojęcie następnika. Warunek końca pętli uzyskujemy tworząc podzbiór N ograniczony "od góry". Z kolei ciałem pętli jest w tej sytuacji każda funkcja zdefiniowana na podzbiorze liczb naturalnych.

2

Ja bym rekursji nie nazywal petla jednak :)

Z kolei ciałem pętli jest w tej sytuacji każda funkcja zdefiniowana na podzbiorze liczb naturalnych.

A to jakas funkcja cokolwiek modyfikuje?

0

W C/C++ jest kilka rodzajów pętli nieskończonych:

  1. while(1) { } // obsługa pętli zdarzeń w jednoukładowcu
  2. do { } while(0); // w zasadzie anty-pętla, wielokrokowe makro - https://stackoverflow.com/a/257425
  3. for(;;) - zaoszczędzony 1 bajt w stosunku do while(1)
3

Ja też nie rozumiem pętli. Dla tego od 4 lat albo i więcej ich nie piszę, zostawiam to twórcom Java i bibliotek xD

4
cerrato napisał(a):

Zwykłe pętle for są nieintuicyjne, nielogiczne i niezgodne z naturą.
@vpiotr - nie zgadzam się. Dla mnie to jest najprostsza z możliwych konstrukcji. Mówisz programowi, że ma dany kawałek wykonać X razy i on po prostu to robi :P Nawet podany przez Ciebie przykład wykonuje się dokładnie tak, jakbym tego oczekiwał. Czy możesz wyjaśnić, co tam jest nielogicznego i nieintuicyjnego?

Większość czynności które wykonuje człowiek nie podpadają pod pętle: dokładnie tyle razy i koniec.
Nie chodzi o to, że ktoś nie potrafi zrobić coś dokładnie n razy ale o określenie z góry ile to ma być te n.

Na przykład, odkurzanie pokoju to jazda odkurzaczem aż będzie czysto. Spytaj kobiety ile dokładnie razy masz przejechać szczotką i poczeka j na jej reakcję.

To co robimy w życiu opiera się na względności, od do, aż będzie, na środku, na lewo od.
Proste ustawienie telewizora to na środku wolnej ściany która nie jest zasłonięta przez szafkę a szafkę przesunęliśmy bo wcześniej uderzały o nią drzwi.

Nawet proste zadanie jakie wrzuciłem wyżej: narysowanie kilku co raz większych choinek pętlami nie jest takie proste, bo za pierwszym razem albo rosną po skosie albo pieniek nie jest na środku.
A z tym zadaniem radzą sobie dzieci w młodszych grupach przedszkolnych: weź największe kółko, na nim na środku ustaw mniejsze, na nich jeszcze mniejsze, na samej górze na środku mały klocek.

1

Nie spodziewałem się takiego odzewu, miło się czyta wasze komentarze i dziękuję za sugestie i przykłady. Może jak popracuję więcej to zrozumiem. Jestem totalną zielonką na razie, uczyłem się z kursu Microsoftu na Youtube, a teraz powoli, wykonując ćwiczenia, które niekoniecznie mi wychodzą przerabiam ten kurs - "
https## ://www.youtube.com/watch?v=_uQrJ0TkZlc". Kupiłem też abonament na próbę na eduwebie, bo był w promocji ale jak się okazało kurs Pythona od podstaw nie jest dokładnie rzecz biorąc taki od podstaw. Niemniej jednak nie muszę wiedzieć nie wiadomo czego, chcę na początku nauczyć się podstaw automatyzacji, żeby w ogóle wejść w IT przez testera, a z tego co słyszałem na rynku no w tym momencie jest podobno tragedia dla juniorów.
@cerrato - jeśli chodzi o przykład to jest właśnie zbudowanie kształtu literki 'F' ze znaków 'x' używając pętli w pętli 'for'. Podobne do tego, które zaproponował @BraVolt. Siedziałem, dumałem, później próbowałem rozpracować rozwiązanie i nic. Beton.
@Silv - 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ś.
@scibi92 oraz @jarekr000000 - spróbowałem wersji uproszczonej, stworzyłem listę, no i zatrzymałem się w miejscu 'for wyraz in lista', bo tyle na razie rozumiem, nie potrafię wejść forem w for bo jest to dla mnie nie nielogiczne :D dla każdego elementu z listy mam przypisać każdy....co? Mniej więcej tu jest znak stop.
@Schadoow - sporo pracy jeszcze przede mną, spróbuję się nie zrazić
@hzmzp - jeszcze chyba się właśnie zastanowię, między Pythonem i Javą po przeczytaniu wielu opinii wybrałem Pythona, bo podobno jest łatwiejszy, bardziej intuicyjny, itp.
@lsikora - jeśli mi mózg nie załapie, to chyba też to w ten sposób zostawię, bo przykład z wydrukowaniem choinki z iksów, można było (przynajmniej w Pythonie) zrobić bez użycia podwójnej pętli i takie prostsze rozwiązania są mi bliższe.

0

nie rozumiesz jak działa przetwarzanie informacji, weź odpal sobie symulator maszyny turinga i poćwicz

1 użytkowników online, w tym zalogowanych: 0, gości: 1