• 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?

VPS Starter Arubacloud
0 głosów
442 wizyt
pytanie zadane 26 sierpnia 2021 w Rozwój zawodowy, nauka, praca przez El Lirón Obywatel (1,350 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,350 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 470 wizyt
pytanie zadane 15 grudnia 2020 w Rozwój zawodowy, nauka, praca przez dellek1 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 264 wizyt
0 głosów
1 odpowiedź 324 wizyt
pytanie zadane 21 listopada 2019 w Rozwój zawodowy, nauka, praca przez kingof Początkujący (310 p.)

93,008 zapytań

141,975 odpowiedzi

321,256 komentarzy

62,350 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...