Ця стаття не містить . (липень 2013) |
Хвостова рекурсія — це випадок рекурсії, коли рекурсивний виклик функції відбувається наприкінці її роботи. Використовується у мовах програмування для оптимізації, через можливість заміни виклику функції на ітерацію, без використання стеку. Ця оптимізація широко використовується у функціональних мовах програмування, а також у таких мовах програмуваннях як C завдяки прапорцям оптимізації для компілятора.
Опис
Коли відбувається виклик функції комп'ютер має запам'ятати адресу повернення, щоб після завершення викликаної функції повернутися і продовжити виконання програми. Зазвичай адреса виконання зберігається у стеку. Іноді, остання дія функції після завершення всіх інших операцій, це просто виклик функції, можливо самої себе, і повернення результату. В цьому випадку немає необхідності запам'ятовувати адресу повернення, нововикликана функція буде повертати результат безпосередньо за адресою повернення записаною для початкової функції.
Приклади
Приклад на Scheme:
(define (factorial n) (define (fac-times n acc) (if (= n 0) acc (fac-times (- n 1) (* acc n)))) (if (< n 0) (display "Невірний параметр!") (fac-times n 1)))
Приклад на Scala:
def factorial(x: BigInt) = { def f2(x: BigInt, sum: BigInt): BigInt = if (x == 1) sum else f2(x - 1, x * sum) f2(x, 1) }
Приклад на Erlang:
-module(test). -export([fac/1]). fac(N) -> fac(N,1). fac(0,A) -> A; fac(N,A) -> fac(N-1,N*A).
Див. також
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno lipen 2013 Hvostova rekursiya ce vipadok rekursiyi koli rekursivnij viklik funkciyi vidbuvayetsya naprikinci yiyi roboti Vikoristovuyetsya u movah programuvannya dlya optimizaciyi cherez mozhlivist zamini vikliku funkciyi na iteraciyu bez vikoristannya steku Cya optimizaciya shiroko vikoristovuyetsya u funkcionalnih movah programuvannya a takozh u takih movah programuvannyah yak C zavdyaki praporcyam optimizaciyi dlya kompilyatora OpisKoli vidbuvayetsya viklik funkciyi komp yuter maye zapam yatati adresu povernennya shob pislya zavershennya viklikanoyi funkciyi povernutisya i prodovzhiti vikonannya programi Zazvichaj adresa vikonannya zberigayetsya u steku Inodi ostannya diya funkciyi pislya zavershennya vsih inshih operacij ce prosto viklik funkciyi mozhlivo samoyi sebe i povernennya rezultatu V comu vipadku nemaye neobhidnosti zapam yatovuvati adresu povernennya novoviklikana funkciya bude povertati rezultat bezposeredno za adresoyu povernennya zapisanoyu dlya pochatkovoyi funkciyi PrikladiPriklad na Scheme define factorial n define fac times n acc if n 0 acc fac times n 1 acc n if lt n 0 display Nevirnij parametr fac times n 1 Priklad na Scala def factorial x BigInt def f2 x BigInt sum BigInt BigInt if x 1 sum else f2 x 1 x sum f2 x 1 Priklad na Erlang module test export fac 1 fac N gt fac N 1 fac 0 A gt A fac N A gt fac N 1 N A Div takozhStek viklikiv Perepovnennya bufera Pogodzhennya vikliku Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi