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

+1 głos
356 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 (190,170 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,730 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,730 p.)
W sumie tak, funkcja random nie powinna milion razy losować nieparzystych. Wspomniałem dla czujności.

Podobne pytania

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

93,731 zapytań

142,669 odpowiedzi

323,286 komentarzy

63,291 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...