• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ćwiczenia z rekurencji - czy robię to dobrze?

Object Storage Arubacloud
0 głosów
356 wizyt
pytanie zadane 26 sierpnia 2021 w Rozwój zawodowy, nauka, praca przez El Lirón Obywatel (1,320 p.)

Cześć!

Chcę dobrze nauczyć się tej rekurencji i dlatego robię zadania. Czy bylibyście uprzejmi spojrzeć, czy:
1) robię to dobrze;
2) dałoby się to zrobić lepiej w jakiś inny sposób.

Zadanie pierwsze to zwykłe potęgowanie, drugie polega na napisaniu wyrażenia od tyłu, a trzecie ma sprawdzić, czy podane wyrażenie jest palindromem czy nie.

 

/* potęgowanie */
let x = 3;
let y = 4;

const potegowanie = (x, y) => {
    if (y == 0) {
        return 1;
    }
    else {
        return x * potegowanie(x, y-1)
    }
};

/* odwracanie wyrazu */
let s = "dalibomba";

const odwracanieWyrazu = (s) => {
    if (s.lenght == 0) {
        return "";
    }
    else {
        let letter = s.substr(s.lenght-1, 1);
        s = s.substr(0, s.lenght-2);
        return letter + odwracanieWyrazu(s);
    }
}

/* palindrom */
let w = "kajak";

const czyToPalindrom = (w) => {

    let odwrocony;

    if (w.lenght == 0) {
        if (w === odwrocony) {
            return true;
        }
        else {
            return false;
        }
    }

    else {
        let letter = w.substr(w.lenght-1, 1);
        odwrocony = odwrocony + letter;
        w = w.substr(0, w.lenght-2);

        return letter + odwracanieWyrazu(s);
    }
}

Dzięki za każdą opinię

1 odpowiedź

+2 głosów
odpowiedź 26 sierpnia 2021 przez mb-dir Mądrala (6,710 p.)
edycja 26 sierpnia 2021 przez mb-dir

Witaj, po wrzuceniu tego na codepena, potęgowanie działa, ogólnie napisałeś taki "książkowy" algorytm, który jest nauczany w szkołach, ale nie za bardzo rozumiem co się stało z dwiema pozostałymi funkcjami, po ich uruchomienu wyskakuje komunikat:

Uncaught RangeError: Maximum call stack size exceeded 

Oznaczający, że funkca wywołuje samą siebie w nieskończoność. W funkcji czyToPalindrom wywołujesz odwracanieWyrazu co przeczy troche definicji rekurencji(bo rekurencja to funckcja która wywołuje sama siebie), ponadto, mała literówka, nie lenght,  tylko length. Tak ogólnie, to kompletnie nie rozumiem twojego zamysłu odnośnie funkcji czyToPalindrom, dlaczego w niej wywołujesz inną funckje z innym argumentem?

Co do drugiej funkcji, to warunek podstawowy, w twoim przypadku s.length == 0, nigdy nie nastąpi, bo niby kiedy długość s jest skracana?, więc funkcja wywołuje samą siebie w nieskonczoność. 

Ogólnie w dwóch niedziałających funkcjach problem polega na tym, że warunek podstawowy nigdy nie jest spełniony, i przez co te funkcje wywołują sie w nieskonczonosc.

s-zmienna oznaczająca wyraz
i=0-zmienna oznaczająca początek wyrazu(więc 0)
j=s.length-1 = ostatnia litera wyrazu

funckcja palindrom
jeżeli i > j
	return true;
w przeciwnym wypadku jeżeli s[i] !== s[j]
	return false;
w przeciwnym wypadku
	return palindrom(s, i+1, j-1);

To co wrzuciłem powyżej to jakiś tam pseudokod napisany na szybko, przedstawia on rekurencyjny algorytm na palindrom, coś podobnego miałem w szkole, spróbuj go zaimplementować, jeżeli nie będziesz rozumiał o co w nim chodzi napisz, spróbuje wytłumaczyc

Jeżeli zrozumiesz jak działa powyższy algorytm, to odwracanie wyrazu mozna zrobic analogiczne, z jednym małym ale, z którym mam nadzieje sobie poradzisz

EDIT

Tak ogólnie to radze nazywać zmienne w bardziej zrozumiały sposób(albo dodać do nich jakiś komentarz opisujący ich znaczenie), np w funkcji wykonującej potęgowanie, zmienne o nazwach podstawa i wykładnyk, mówiły by więcej niż y, szczególnie polecam dokładnie nazywać/opisywac zmiennie, wtedy gdy nie do końca rozumiesz jakiś algorytm, wtedy masz taką wizualną podpowiedź co jest czym.

Jeszcze druga sprawa, może się troche czepiam na wyrost, ale warto używać === zamiast ==, używając == możesz się czasem nieźle zdziwić, gdy "0" == 0 da ci true, więcej o tym np tu

 

komentarz 27 sierpnia 2021 przez El Lirón Obywatel (1,320 p.)
Dziękuję Ci za Twoje uwagi, wezmę je sobie do serca.

Ja myślałem że linijka 23:
s = s.substr(0, s.lenght-2);
załatwi sprawę, bo zastępuje ciąg znaków nowym ciągiem o jeden ostatni znak krótszym...
komentarz 27 sierpnia 2021 przez mb-dir Mądrala (6,710 p.)

Cholibka, faktycznie, punkt dla ciebie. Warunek podstawowy się wykona, jednak zwracana wartość nie jest prawidłowa(click - odpal console), skracasz przekazywany wyraz aż za bardzo, a co do czyToPalindrom to tak czy siak nie jest to rekurencja, bo wewnątrz siebie wywołuje inną funkcje

Podobne pytania

0 głosów
0 odpowiedzi 421 wizyt
pytanie zadane 15 grudnia 2020 w Rozwój zawodowy, nauka, praca przez dellek1 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 232 wizyt
0 głosów
1 odpowiedź 301 wizyt
pytanie zadane 21 listopada 2019 w Rozwój zawodowy, nauka, praca przez kingof Początkujący (310 p.)

92,551 zapytań

141,396 odpowiedzi

319,527 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...