BG Development


  Reply to this topicStart new topicStart Poll

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



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

Мнения: 268
Регистриран на: 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



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

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



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



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

Мнения: 2170
Регистриран на: 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



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

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



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


--------------------
https://www.rust-lang.org/
---
Хора, които са прекалено умни, за да се занимават с политика, са наказани да бъдат управлявани от глупаци.
---
Life is hard; it's harder when you're stupid.
---
Black metal is like coffee. You have to learn to drink it but when you get used to it, you just want it darker and darker
PMEmail PosterUsers Website
Top
SuN
Публикувано на: 21-02-2019, 11:56
Quote Post


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

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



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

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



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

Мнения: 268
Регистриран на: 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



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

Мнения: 302
Регистриран на: 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
Ранг: Почетен член

Мнения: 6108
Регистриран на: 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