Znaczenie słowa return w funkcji

0

hej wracam do problemu już 3 tydzień (dorywczo) ;(

mam prośbę przykład ten pochodzi z książki:
http://www.bt4.pl/kursy/javascript/wszystko-jasne/r3-funkcje

function findSequence(goal) {
  function find(start, history) {
    if (start == goal)
      return history;
    else if (start > goal)
      return null;
    else
      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");
  }
  return find(1, "1");
}

print(findSequence(24));

Proszę o wyjaśnienie - gdy wartość "start = 26" następuje spełnienie warunku "else if" - i funkcja zwraca return (#1)
i następuje wyjście z funkcji - to dlaczego ta funkcja wywołuje się ponownie sama?? czy to "return null" jest z czymś porównywane??

dodanie znacznika <code class="javascript"> - fp

1

Z prostego powodu. Bo to nie drugi warunek jest spelniony a trzeci. Goal = 24 (w Twoim kodzie) a start = 1. Zachodzi warunek 3 i masz rekurencje

0

nie rozumiem
dlaczego piszesz start = 1 ? - start w tym akurat przypadku po przekroczeniu (sprawdzałem krok po kroku) przybiera wartość równą 26 - i wtedy następuje

else if (26 > 24)
return null;

I właśnie w tym miejscu nie wiem jak to się robi, że on znowu tą funkcje wywołuje. On wtedy nie idzie do 3 przypadku! sprawdzałem to....

0

A czy czasem nie masz tam rekurencji jednak? I po return null wracasz do poprzedniego wywołania rekurencji? ;]

0

Tak, jest tam rekurekcja.... Czyli przy rekurencji raz przynajmniej wywołanej - return - wychodzi jak gdyby jeden poziom wyżej do...kodu który ją wywołał - a w tym przypadku do tej samej funkcji...

0

No a jak sobie to niby inaczej wyobrażałeś? o_O return wychodzi z danej funkcji i tyle. Cały stos wywołań pozostaje nienaruszony. Przeciez jak z main() zawołasz funkcja1() a z niej funkcja2() to powrót z funkcja2() sprawi że znów znajdziesz się w funkcja1(), o jedną linijkę dalej.

0

no właśnie "o jedną linijkę dalej"

a tutaj wychodzi o jeden poziom do góry i samo się uruchamia... coś niesamowitego... Najgorsze jest to, że rozumiem już mniej więcej istotę działania, ale nigdy bym takiego kodu sam nie napisał...

return null powoduje wyjście z rekurencyjnej funkcji find "level 1" do funkcji find "level 0"...chyba mam problem z określeniem z którego miejsca ta funkcja została wywołana...

no chyba że...stąd jakoś

return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");

no i czy ona robi później

null || find....

trudne to :(((

0

Rozumiem ze ukradli ci takie cudo jak debuger? Wiesz ze da sie wykonywać kod krok po kroku? ;]

0

tak wiem, wykonuje właśnie

i w momencie return null;
wskakuje na
} //TUTAJ
return find(1, "1");

function findSequence(goal) {
  function find(start, history) {
    if (start == goal)
      return history;
    else if (start > goal)
      return null;
else {
  if (found == null)
  var found = find(start + 5, "(" + history + " + 5)");
    found = find(start * 3, "(" + history + " * 3)"); //i idzie tutaj
  return found;
}
  }
  return find(1, "1");
}

print(findSequence(24));
0

no dobrze, bardzo dziękuje za pomoc
po prostu nie potrafię tego zrozumieć i już :/

ok już troszkę zrozumiałem
to wszystko bazuje na

return find... || find...

1 użytkowników online, w tym zalogowanych: 0, gości: 1