Рекурсивті функциялар
Өзін өзі шақыратын функция рекурсивті деп аталады. Мұндай ре-
курсияны тура деп атайды. Екі немесе одан артық функциялар бір-бірін
шақырған кезде туындайтын рекурсияны жанама рекурсия деп атаймыз.
Егер функция өзін шақырса, қарапайым функцияны шақырған кездегі
сияқты, стекте осы функция параметрлері мəндерінің көшірмесі жасала-
ды, содан кейін басқару функцияның алғашқы атқарылушы операторына
беріледі. Қайталап шақыру жағдайында бұл процесс қайталанады. Есеп-
теулер аяқталуы үшін əрбір рекурсивті функцияда қайтару операторымен
аяқталатын кем дегенде бір рекурсивті емес алгоритм тармағы болу керек.
Функция аяқталған кезде стектің сəйкес бөлігі босатылады жəне басқару
рекурсивті шақырудан кейінгі нүктеден атқарылуы жалғасатын шақырушы
функцияға беріледі.
Рекурсивті функцияның классикалық мысалы ретінде факториалды
есептеуді (бұл факториалды дəл осылай есептеу керек екендігін білдірмейді)
қарастыруға болады. Мұнда
n
санының факториал мəнін алу үшін, (
n-1
)
санының факториалын
n
санына көбейту қажет. Сонымен қатар, 0!=1 жəне
1!=1 болатыны белгілі.
long fact(long n){
if (n==0 || n==1) return 1;
return (n * fact(n-1));
}
Осы программа үзіндісін қысқартылған түрде былайша жазуға болады:
long fact(long n){
return (n > 1) ? n * fact (n-1) : 1;
}
Рекурсивті функцияларды көп жағдайда рекурсивті алгоритмдерді
ықшамды түрде жүзеге асыру үшін, сонымен қатар, рекурсивті сипатталған
мəліметтердің құрылымдарымен, мысалы, екілік бұтақтармен жұмыс
істеу үшін қолданады (132 б.). Кез келген рекурсивті функцияны рекурсия-
ны қолданбай жүзеге асыруға болады, ол үшін программалаушы барлық
қажетті мəліметтердің сақталуын өзі қамтамасыз ету керек. Рекурсияның
артықшылығы ықшам түрде қысқаша жазылуында болып есептеледі, ал
рекурсияның кемшіліктеріне функцияны қайта шақыруларға жəне оған пара-
метрлер көшірмелерін беруге жұмсалатын уақыт пен жадының шығыны жəне,
ең негізгісі, стектің толып кету қаупі жатады.
Функцияларды қолдана отырып, программаларды құру технологиясы
практикумның [11] жетінші семинарында қарастырылған.
|