Wpis z mikrobloga

Witam Mireczki (przepraszam że tak dużo ludzi z tagów ale w sumie nie wiedziałem który tag, a to dla was będzie jak przedszkole( ͡° ͜ʖ ͡°))

Mam zrobić algorytm takiego czegoś: Odgadywanie wieku użytkownika przez komputer. Użytkownik

odpowiada tylko TAK/NIE.

Całkowicie tego nie rozumiem, po prostu jestem debilem i nie wiadomo ile myślę przychodzi mi tylko do głowy wypisywanie po kolei jaką liczbę może wpisać człowiek (tylko co kiedy będzie miał 1000, wtedy pisał bym to miesiąc)

Tak jak mówiłem dla was to podstawówka a ja pierwszy raz mam z tym do czynienia i jest mi smutno bo nie rozumie( ͡° ʖ̯ ͡°)

#algorytmy

#informatyka

#naukaprogramowania
  • 34
@inuu: musisz wykonać wyszukiwanie połówkowe. Zakładamy, że człowiek ma max 100 lat. Pytasz się:

Masz 50 lat?

Jeśli odpowie NIE, to masz dwa wybory:

Masz mniej niż 50 lat, czy więcej?

I na tej podstawie znowu szukasz, aż dojdziesz do momentu znalezionego wieku.
@japer: Chodzi o to ze zaczynam np. od 50 i później T/N 25, 12 itd.? to zajmie dużo miejsca i czasu nawet jak zrobię to tylko do 100, nie ma innej metody?
@inuu: musisz utworzyć sobie funkcje, która będzie operować na przedziale od - do. Najlepiej, żebyś wykonał jaką funkcję w wybranym języku, która by była uruchomiona rekursyjnie. W jakim języku klepiesz?
@japer: W tym problem że w żadnym jestem całkowitym świerzakiem z zaczętymi wczoraj studiami, dlatego mam zerowe pojęcie, a zadanie w którym mam zrobić algorytm kiedy człowiek może odpowiadać tylko tak lub nie kojarzy mi się własnie tylko z tym wyszukiwaniem polowkowym. A w algorytmie blokowym raczej muszę to zrobić tak bardziej opisowo.
@inuu: Schemat jest źle ułożony. Usunąłem pseudokod specjalnie (nie miej mi za złe, ale muszę stymulować mózg, a nie ułatwiać :D).

Algorytm musi mieć dane wejściowe. W wypadku szukania wieku potrzebny będzie nam przedział do "zgadywania". Na początek zakładamy, że człowiek ma sto lat. Czyli szukamy w przedziale od 0 do 100.

Dla mniejszego bajzlu, najlepiej wykonać sobie coś w rodzaju funkcji. Funkcja to inaczej podprogram, wydzielony fragment kodu. Nazwijmy ją
@japer: Rozumiem że dane wejściowe zapisze jako <0;100>, czy może inaczej? nie wiem czy mogę wpisać do algorytmu samo słowo szukaj z przedziałem, czy jest to poprawne?

Funkcja zapewne może skonczyć prace znajdując prawidłową wartość, czyli pod warunkiem ze znajdzie i że zostaną wprowadzone odpowiednie dane wejściowe?

Funkcja ma szukać dopóki nie odnajdzie odpowiedniej liczby(serio, tyle tylko wymyslilem, alko nie pomaga( ͡° ʖ̯ ͡°)), przedział mogę sukcesywnie
@inuu: Połowę odrzucisz zgodnie z odpowiedzią człowieka.

Koniec jest wtedy, gdy twoje "od" i "do" są sobie równe. Bo jakby algorytm trafił w punkt.

Jeśli spytasz się już, to wiesz, jaką połówkę odrzucić. Gdy odrzucisz, uruchamiasz ten sam algorytm, ale dla połówki tej, która została. :D
@japer: Czyli na wejściu daje <0;100> i od tego tak lub nie? jesli nie to powrót i pętla, jeśli tak to dzielę na połówki <0;50> i odtąd ide albo w gorę albo w dół?

sorki ze tak mało ogarnięty jestem, ale myślę ze taki początek to nic nowego ( ͡° ͜ʖ ͡°)

to znaczy ze tak czy inaczej będę musiał wypisać 100 liczb i 100 końców dla
@inuu: może zróbmy inaczej. Nie ma sensu wypisywać tle bloków, bo ten algorytm jest oparty w głównej mierze na rekursji (też można na pętlach).

Kiedy masz do czynienia z odpowiedzią, że wiek jest mniejszy od środka, to wtedy z przedziału [a; b] masz taki przedział: [a; (a+b)/2], a w przeciwnym wypadku [(a+b)/2; b].

W pętli powtarzasz te same kroki, aż uzyskasz taki warunek, że a = b.
@japer: Po wpisaniu danych a=0 b=100 rozumiem ze mogę zacząć od [a; (a+b)/2] lub tego drugiego działania ponieważ nie ma to znaczenia ktorego użyje jako pierwszego, tak?

jeśli robię to teraz dobrze to czy po bloku <0;50>//czy wiek znajduje sie w tym przedziale

robie tak to... to nie wiem co robię bo wpisując to działanie jeszcze raz nie wiem czy jest poprawnie, znowu tez jesli ktos odpowie ze to nie znajduje
@inuu: Od którego działania zaczniesz, zależy od odpowiedzi użytkownika, czy ma mniej niż tyle, ile wynosi środek. Jeśli ma mniej - 1. operacja, a jak nie, to druga.
@japer: Czy w jak robię np. działanie 3 raz z kolei aby jeszcze bardziej zawęzić poszukiwania to brane są dane z poprzedniego działania automatycznie np. jesli a wynosi po ktorymś kroku 0 i b=10 to przy tym następnym bloku używając [a; (a+b)/2] będzie wynosiło b=5 czy cały czas bierze początkową 100 i muszę jakoś określić zeby korzystać z poprzedniego wyniku?
@inuu: jeśli wykonujesz "jeszcze raz", to korzystasz z danych, które obliczyłeś w poprzednim kroku. Zakończeniem pętli jest warunek, żeby a równało się b.
@japer: Pytanie w słowie napisze, jakie bloki masz na myśli mówiąc operacyjne (co ma w nich być), i problem bo jeśli biorę liczby z poprzedniego działania to po odpowiedzi NIE na pyt. "czy miesicisz sie w przedziale wiekowym 0-50" nie mogę już dać działania tylko muszę wpisać liczby na żywca 50-100 bo nie widzę innego wyjścia.
@inuu: pierwszy blok warunkowy powinien mieć w sobie a = b i te dwa bloki końcowe powinny być podłączone do tego bloku. W pierwszym bloku warunkowym strzałka "nie" powinna iść w stronę prawą, a lewa strzałka powinna prowadzić do bloku, w którym wydrukujesz "a". Zadanie gotowe.
@japer: Nie muszę zadać żadnego pytania, czy pytanie o wiek nie jest potrzebne tam? jeśli dam pętle to caly czas będzie sie pytalo czy mam mniej niz 50 lat.
@japer: i tak poza tym i zmianą 50 na (a+b)/2 wszystko jest dobrze?, jeśli tak to moze nawet bede na tym przykładzie cos próbował 1 raz napisać.
@japer: W takim razie nie wiem jak ci dziękować za poświęcony czas i ogólnie za wytłumaczenie tego OGROMNE DZIĘKI()