BG Development


  Reply to this topicStart new topicStart Poll

> Как точно работи рекурсията
Zeardn
Публикувано на: 21-02-2019, 10:37
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 286
Регистриран на: 05.12.14



Колеги, имам следния код:

CODE
function fibonacci(num) {
      debugger;
 if (num <= 1) return 1;

 return fibonacci(num - 1) + fibonacci(num - 2);
}


... как точно се случва магията с тази рекурсия? Моля някой да ми обясни по-подробно как се извикват тези методи, защото се обърках... знам как работи една проста, обикновена рекурсия, например за факториел, но тук просто се обърках.

Return стойността е ДВА ПЪТИ извикване на една и съща функция. Какво се случва с тези операции така и не успях да разбера icon_sad.gif


--------------------
StackOverflow Member
PMEmail Poster
Top
stewie
Публикувано на: 21-02-2019, 10:43
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5784
Регистриран на: 14.07.16



Извикването на метода се пази в стека. Пълни се докато не стигне дъното и оттам насетне тръгва към върхът на стека. Мисля, че с подходящ дебъгер може да си го представиш добре.
PM
Top
sailer
Публикувано на: 21-02-2019, 10:56
Quote Post



Име: Александър Георгиев
Група: Потребител
Ранг: Почетен член

Мнения: 2175
Регистриран на: 15.01.07



QUOTE (stewie @ 21-02-2019, 10:43)
Извикването на метода се пази в стека. Пълни се докато не стигне дъното и оттам насетне тръгва към върхът на стека. Мисля, че с подходящ дебъгер може да си го представиш добре.

Според мен трябва първо да разбере че стека всъщност не е пържола, иначе и с дебъгер пак ще се чуди защо нещата се движат в определена последователност.


--------------------
But when I taste rakija
In my head anarhija
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 21-02-2019, 11:38
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3020
Регистриран на: 21.02.18



гледай Inception - абсолютно същотото е !!!


--------------------
https://www.rust-lang.org/
---
" Не може да си на висок пост без да си подкупен. Ще те махнат." - SuN Трола
PMEmail PosterUsers Website
Top
SuN
Публикувано на: 21-02-2019, 11:56
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 9614
Регистриран на: 27.01.05



Стека е като този сандвич: user posted image

Слагаш първо най-долната филийка и после редиш вкусни елементи отгоре. Накрая понеже става прекалено голям за един залък започваш да си взимаш парчета само най-отгоре и ги ядеш едно по едно.


--------------------
Само аз не троля.
Всички коментари са плод на художествена измислица и нямат общо с действителни и недействителни лица, събития и факти.
PMEmail Poster
Top
Zeardn
Публикувано на: 21-02-2019, 15:53
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 286
Регистриран на: 05.12.14



Опитах да си го обясня по следния начин с дебъгера на JS в браузъра, но пак не ми стана ясно едно - как се връща рекурсията обратно, след като достигне дъното. Моля някой да ми разясни това icon_sad.gif

CODE
function rec(n) {
      debugger;
      if(n == 0) {
            return 1;
   }
      return n * rec(n-1);
}

rec(2)


Когато n стигне 0, последната функция (в дъното) връща 1.
След това се връща предходната функция и се изпълнява израза n * rec(n-1) -> n от тази (предходната) трябва да е 1 по пътя на логиката и съответно от rec(n-1) е върната стойност 1. 1 * 1 = 1, но то връща 2. Това е една част от изпълнението, проследена с дебъгера. Къде бъркам?

Това мнение е било редактирано от Zeardn на 21-02-2019, 15:59


--------------------
StackOverflow Member
PMEmail Poster
Top
40oz
Публикувано на: 21-02-2019, 16:16
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 347
Регистриран на: 23.05.13



Виж Figure 1.3 от това по-ясно няма накъде 1.2.1 Linear Recursion and Iteration
PMEmail Poster
Top
wqw
Публикувано на: 21-02-2019, 16:34
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 6148
Регистриран на: 10.06.04



Тук никой от старите кучета не може да ти обясни хубаво какво точно е рекурсия. Само някой който е минал по този път с не повече от 6-12 месеца давност може да ти влезе в положение и да ти го обясни като на "човек" дето се вика.

Но запомни че в този ред

return fibonacci(num - 1) + fibonacci(num - 2);

. . . първо се изчислява fibonacci(num - 1) и докато не се върне от (дълбоката num-1) рекурсия не се пуска по втората (дълбока num-2) рекурсия.

Това е важно да го разбереш отрано -- никога не се изпълняват две неща едновременно. (JS в browser-е е никога никога, в другите езици е повечето никога.) Никога не може докато изчисляваш Фибоначи да ти кликне някой бутон.

cheers,
</wqw>


--------------------
PMEmail PosterUsers Website
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0