Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмдеу жане багдарламалау негиздери 4 г.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

7 Дәріс тақырыбы: Рекурсивті алгоритмдер.

Рекурсивті деп өзінің көмегімен анықталатын немесе ішінара тұратын объектіні атайды. Рекурсия тек қана математикада емес күнделікті өмірде де кездеседі. Кім өзінің жеке бейнесі көрсетілген жарнамалық картинканы көрген жоқ?

Математикада рекурсивті анықтау қуатты аппарат болып табылады. Міне, бірнеше жалпыға белгілі мысалдар: натурал сан, ағаш және белгілі бір функциялар.

1. Натурал сандар:

а) 0 наурал сан;

б) натурал саннан кейінгі сан натурал сан болады.

2. Ағаш:

а) 0 ағаш (оны «бос ағаш» деп атайды),

б) егер t1 және t2ағаш болса, онда екі төмен орналасқан ағашы бар төбеден тұратын құру да ағаш болады.

3 "Факториал" функциясы п! (теріс емес тұтас сандар үшін):

а) 0! = 1,

б) п >0: п ! = п *(п- 1)!

Рекурсивті анықтаманың қуаттылығы мынада, ол ақырғы айтылымның көмегімен объектілердің ақырсыз жиынын анықтауға мүмкіндік береді. Осыған ұқсас ақырғы рекурсивті программаның көмегімен ақырсыз есептеуді суреттеуге болады, сонымен қатар программада айқын қайталамалар болмайды. Алайда рекурсивті алгоритмдерді өңделетін деректердің құрылымында немесе есептелетін функцияда, шешілетін есепте рекурсия анық бар болған жағдайда қолданған дұрыс. Р рекурсивті программасын жалпы түрде S операторлар жиынының (Р-дан тұрмайтын) және Р-дың өзінің кейбір композициясы ретінде көрсетуге болады:

P=P[S,Р].

Рекурсивті программаларды бейнелеу үшін процедура немесе бағыныңқы программа түсінігінің болуы қажет және жеткілікті, өйткені олар кез келген операторға ат беруге мүмкіндік береді, оның көмегімен оған қатынауға болады. Егер Р кейбір процедурасының өз өзіне айқын сілтемесі болса, онда оны тура рекурсивті деп атайды, егер Р, Р-ға сілтемесі бар (тура және жанама) басқа Q процедурасына сүйенсе, онда Р-ды жанама рекурсивті деп атайды. Сондықтан программаның мәтіні (тексті) бойынша рекурсивтілік барлық уақытта айқын анықталмайды.

Негізінен процедурамен жергілікті (локальды) объектілер жиынын, яғни тек қана осы процедурамен анықталған және одан тыс қолданылмайтын немесе мәні жоқ айнымалылардың, тұрақтының, типтер мен процедуралардың жиынын байланыстырады. Мұндай процедураның әрбір рекурсивті активтенуі кезінде жергілікті байланыстырылған айнымалылардың жаңа жиыны туындайды. Олардың алдыңғы «буынның» төңіректік жиынының сәйкес элементтері сияқты аттары болса да, олардың мәндері соңғысынан ерекше, ал аттар бойынша кез келген қақтығыстар идентификатордың әрекет саласын анықтайтын ережелердің көмегімен шешіледі: идентификатор барлық уақытта айнымалылардың ең соңғы жасалған жиынына жатқызылады. Бұл ереже процедурамен байланысты анықтау бойынша процедуралардың өлшемдері үшін тура болады.

Цикл операторларына ұқсас рекурсивті процедуралар аяқталмайтын есептеулерге жеткізуі мүмкін, сондықтан бұл проблемаға ерекше назар аудару қажет. Жұмыс қай уақытта болса да аяқталуы үшін Р-ға рекурсивті қатынасу қандай да бір уақытта орындалуы тоқтатылатын кейбір В шартымен басқарылуы қажет. Сондықтан рекурсивті алгоритмдердің барынша дәл схемасын келесі формалардың кез келгеніне келтіруге болады:

P=IF B THEN P[S,P],

P= P[S, IF B THEN P].

Кейбір қайталанбалы процестің ақырын дәлелдеудің негізгі тәсілі мынадай:

1. f(x) < 0 – ден циклдың аяқталу шартының ақиқаттығы шығатын (алғы шарты немесе кейінгі шарты бар) f (х) (хайнымалылар жиыны) функциясы анықталады.

2. Циклдың әрбір өтуі кезінде f (х) азаятыны дәлелденеді.

Осыған ұқсас рекурсияның аяқталуы да дәлелденеді – Р f(x) < 0 –ден ~В шығатын f (х) азайтатыны көрсетіледі. Жекелеп алғанда процедураның аяқталуын қамтамасыз етудің ең сенімді тәсілі – оған кейбір өлшемдер (мән) енгізу, оны п деп атаймыз, және Р-ға рекурсивті қатынау кезінде өлшем ретінде п-1 беру.

Егер бұл жағдайда В ретінде п > 0 қолданылса, онда аяқталуы кепілді. Бұл тағы да екі схемамен бейнеленеді:

Р(п) = IF п > 0 THEN Р [S, Р (п - 1)],

Р(п) = Р [S, IF п > 0 THEN Р (п - 1)].

Практикалық қосымшаларда рекурсияның ең жоғарғы тереңдігі ақырлы ғана емес, сонымен қатар барынша кіші екеніне көз жеткізген дұрыс. Р процедурасын әрбір рекурсивті активтеу оның айнымалыларын орналастыру үшін жады талап етеді. Мұндай төңіректік айнымалылардан басқа Р жаңа активтеуін аяқтағаннан кейін оған қайта оралу мүмкін болуы үшін «есептеулердің ағымдағы жай-күйін» сақтау қажет.

Рекурсивті алгоритмдер өңделетін деректер рекурсия терминдерінде анықталатын есептер үшін ерекше қолайлы. Алайда бұл деректерді мұндай рекурсивті анықтау есептерді шешу үшін рекурсивті алгоритмді сөзсіз қолдануға кепілдік беретінін білдірмейді. Рекурсивті алгоритмдердің тұжырымдамасын бұл үшін қолайсыз мысалдарда шын мәнінде түсіндіру және рекурсияны программалауда қолдануға қарсы кең таралған қате ұғым туғызды; оларды тіпті тиімсіздіктің синониміне айналдырды.

Алгоритмдік п рекурсияға жоламау қажет программаларды олардың құрылымын бейнелейтін бірқатар схемамен сипаттауға болады (ерекшелігі, онда барлық конструкциялардың соңында немесе басында кРв жалғыз қатынасуы бар):

Р= IF В THEN (S; P),

Р = (S; IF В THEN P).

Мұндай схемалар есептелетін мән жай рекурренттік қатынастардың көмегімен анықталатын жағдайларда орынды. Факториалды есептеудің жақсы таныс мысалын алайық

i =0,1,2,3,4,5,...,

fi=1, 1,2,6,24,120,....

Сандардың біріншісі анықталады -fо=1 анық, ал келесісі алдыңғы санның көмегімен рекурсивті түрде анықталады:

Fi+1=(i+1)* f