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

question-closed Prosta funkcja odnośnie losowania liczby zwraca wartość 'undefined'

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
+1 głos
71 wizyt
pytanie zadane 20 grudnia 2021 w JavaScript przez Nabuchadonozor Gaduła (3,120 p.)
zamknięte 20 grudnia 2021 przez Nabuchadonozor

Witam radośnie wszelkich forumowiczów,

otóż piszę skrypt szyfrujący, w którym potrzebuję wylosować cyfrę. Funkcja posiada dwa typy, odwołanie do pierwszego ( drawNumber(1) ) sprawia, iż funkcja powinna zwrócić losową liczbę parzystą, natomiast gdy przekażemy do funkcji parametr o wartości 2, to zwracana wartość powinna być liczbą nieparzystą. Jednakże zwraca mi ta funkcja wartość 'undefined', czy mógłby ktoś pomóc mi znaleźć wyjście z labiryntu nieprawidłowości?

 

function drawNumber(type){
    var result;

    if(type == 1){
        result =  Math.floor(Math.random() * 22);
        if(result%2 == 0){
            return result;
        } else drawNumber(1);
    } else if(type == 2){
        result =  Math.floor(Math.random() * 22);
        if(result%2 == 1){
            return result;
        } else drawNumber(2);
    }
}

 

komentarz zamknięcia: brak return'a podczas rekurencji
komentarz 20 grudnia 2021 przez Nabuchadonozor Gaduła (3,120 p.)

Dodaje, że zwracana wartość np. poprzez console.log(drawNumber(2)) nie zawsze zwraca 'undefined', czasami zwraca poprawnie.

2 odpowiedzi

+2 głosów
odpowiedź 20 grudnia 2021 przez ScriptyChris Mędrzec (191,540 p.)
wybrane 20 grudnia 2021 przez Nabuchadonozor
 
Najlepsza

Przy

else drawNumber(1);

oraz

else drawNumber(2);

brakuje return, przez co wynik zwrócony z rekurencyjnego wywołania jest "ignorowany" i całość zwraca undefined.

komentarz 20 grudnia 2021 przez Nabuchadonozor Gaduła (3,120 p.)

Kocham Cię stary! W życiu bym na to nie wpadł, z rekurencjami bardzo rzadko miałem okazję pracować, dzięki wielkie! Miłego!

+1 głos
odpowiedź 20 grudnia 2021 przez Chess Szeryf (76,750 p.)
Zamiast var daj let.

Aha i możesz dopisać corner case, kiedy rekurencja jakimś cudem wykona się, np. ponad 100 razy. if x over 100 then result 0
komentarz 20 grudnia 2021 przez Nabuchadonozor Gaduła (3,120 p.)

Tylko, że to dalej nie naprawia błędu (mowa o zmianie z var na let). Zastanawia mnie, dlaczego mówisz "jakimś cudem"? Może w niej jest gdzieś błąd? Może dlatego niekiedy działa, bo wtedy nie potrzebuje rekurencji, a jeśli chce uzyskać parzystą, a randomowa wychodzi nieparzysta i właśnie w tym momencie korzysta rekurencji żeby jeszcze raz spróbować, może wtedy właśnie coś się psuje i wyskakuje 'undefined'..? Już dorzucam tego corner case'a, chociaż nie wiem do końca po co, bo chcę, żeby ona się wykonywała tak długo, aż uzyska poprawny wynik...

1
komentarz 20 grudnia 2021 przez Chess Szeryf (76,750 p.)
W sumie tak, funkcja random nie powinna milion razy losować nieparzystych. Wspomniałem dla czujności.

Podobne pytania

+1 głos
1 odpowiedź 172 wizyt
0 głosów
1 odpowiedź 64 wizyt
pytanie zadane 27 marca 2020 w C i C++ przez Nabuchadonozor Gaduła (3,120 p.)
0 głosów
0 odpowiedzi 285 wizyt
pytanie zadane 12 marca 2020 w C i C++ przez Nabuchadonozor Gaduła (3,120 p.)

90,816 zapytań

139,494 odpowiedzi

313,557 komentarzy

60,313 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...