ТІЛДЕР МЕН АВТОМАТТАР ТЕОРИЯСЫpsu.kz/arm/upload/umk_pdf/12596.pdf · Ф...

36
Ф ФСО ПГУ 7.18.2/05 Қазақстан Республикасы Білім және ғылым министрлігі С. Торайғыров атындағы Павлодар мемлекеттік университеті Физика, математика және ақпараттық технологиялар факультеті Информатика және ақпараттық жүйелер кафедрасы ТІЛДЕР МЕН АВТОМАТТАР ТЕОРИЯСЫ пәні бойынша зертханалық жұмыстарды орындауға арналған әдістемелік нұсқаулар Павлодар

Upload: others

Post on 21-Jan-2020

38 views

Category:

Documents


2 download

TRANSCRIPT

ФФСО ПГУ 7.18.2/05

Қазақстан Республикасы Білім және ғылым министрлігі

С. Торайғыров атындағы Павлодар мемлекеттікуниверситеті

Физика, математика және ақпараттық технологияларфакультеті

Информатика және ақпараттық жүйелер кафедрасы

ТІЛДЕР МЕН АВТОМАТТАРТЕОРИЯСЫ

пәні бойынша зертханалық жұмыстарды орындауға арналған әдістемелікнұсқаулар

Павлодар

ФФСО ПГУ 7.18.2/05

БЕКІТЕМІНФМж/еАТ факультетінің деканы___________ С.К.Тлеукенов 200 __ ж. «___»____________

Құрастырушы: Доцент Джарасова Г.С.

Информатика және ақпараттық жүйелер кафедрасы

050602 «Информатика» мамандығының студенттері үшін

«Тілдер мен автоматтар теориясы» пәні бойынша зертханалық жұмыстарғаәдістемелік нұсқаулар

Кафедра мәжілісінде бекітілді, 200__ж. «___»____________ Хаттама №_____.

Кафедра меңгерушісі _________________________ Нұрбекова Ж.Қ.

Факультеттің әдістемелік кеңесінде құпталды,

200__ж. «___»____________ Хаттама №_____.

ӘК төрайымы _________________________ А.Т.Кишубаева

1 -2 зертханалық жұмыс. Толық автоматтардың эквиваленттілігі менминимизациясы. Дербес автоматтар және олардың минимизациясы.

Мақсаты: Студентерді бағдарламаны кезеңмен құруға үйрету

5.1 Қысқаша теориялық мәліметтерКнут – Моррис – Пратта алгоритмі (КМП)

nxxxX ...21

Оларды оңнан солға, әріппен әріпті қарастырамыз, сонымен қоса натуралсандардың массивін толтырамыз n1...11 , онда i1 = сөз ұзындығы ixx ...11

(l функциясы өткен пункте анықталған). Сөзбен: i1 сөз басынын ұзындығы ixx ...1 , бір уақытта оның соңы болып

келеді. Бұл барлығы бағыңынқы сөзді іздестіруге қандай қатысы бар? Басқа сөзбенайтқанда, A сөзі B сөзінің бағыңқысы болады ма, соны анықтау үшін КМПалгоритмін қолданамыз.

Шешімі. КМП алгоритмін BA сөзіне қолданайық, - арнайы әріп, A

немесе B кездеспейді. A сөзі B сөзінің бағыңқысы болып келгенде ғана,сандарарасында 1 массиві A сөзінің ұзындығына тең болады.

Мысалы n1...11 кестені толтыру алгоритмін жазыңыз.

Шешімі. I бірінші мағынасы i1...11 табылған деп есептейі. Біз сөздін кезекті әріпін оқимыз (т.е. 1ix ) және есептеуміз керек 11 i .

--------------------------------------------------------| x | | оқылған бөлігі--------------------------------------------------------\-----------Z-----------/ \------------Z------------/

Басқа сөзбен айтқанда, Z сөзінің бас жағы бізге керегі 1...1 ixx , Оны соңыболып табылады – оның ішінен ең ұзының таңдауымыз керек. Бұл басталымдырқайдан алынған. Әр қайсысы (босты санамағанда ) Z кейбір сөзінен 1ix

әріптерін қосқанда. пайда болады. Z сөзі ixx ...1 сөздін басы және аяқ жағыболып келеді. Бірақта ixx ...1 сөздің басы мен аяғы болып келетін сөздер келебермейді, одан кейін 1ix әріпі тұру керек.

Z сөзін табу жолы пайда болады. Алдымен ixx ...1 барлық сөздердің басынқарастырайық, сол уақытта ол олардың аяқ жағы болып табылады. Олардың ішінен

1ix әріпінен кейін тұратын сөзді таңдайық. Қажеттінің ішінен ең ұзыныңтаңдайық. Ең соңына 1ix жазғанда, Z ізделетін сөзді аламыз.

Енді айтқандардың бәрін төменде қарастырайық.

i:=1; l[1]:= 0;{кесте l[1]..l[i] дұрыс толтырылған}while i <> n do begin| len := l[i]| {len – сөз басының ұзындығы x[1]..x[i], оның соңы болып келетін| ең ұзын басталымдар қажет болмай қалды | }| while (x[len+1] <> x[i+1]) and (len > 0) do begin| | {бас жағы келмейді, l функциясын қолданайық}| | len := l[len];| end;| {керектіні таптыңыз ба немесе жоқ екеніне көзіңіз жетті ме? }| if x[len+1] = x[i+1] do begin| | {x[1]..x[len] - ең қажетті ұзын бас жағы}| | l[i+1] := len+1;| end else begin| | {қажеттілері жоқ}| | l[i+1] := 0;| end;| i := i+1;end;

Тапсырма 1Жоғарыда келтірілген алгоритмдегі әрекет C кейбір тұрақтылар үшін nC

аспайды.

Тапсырма 2Бұл алгоритмді қолданамыз, X сөздің ұзындығы n сөз бағыңқысы Y сөз

ұзындығы m тең екенін дәлелдейік. (Соны арнайы бөлгішпен қалай жасауға болады). Әрекеттер саны mnC * аспайды, және nC жадысын қалай пайдалнуға болады (егер де тұрақты үлгі қысқа болса, ал оның іздейтін сөзде ол ұзын болады).

Тапсырма 3Сәйкес алгоритмді жазыңыз ( nxxX ...1 сөзі myyY ...1 сөзінің

бағыңқысы болып келеді).

Тапсырма 4Берілген массивтердің элементтері ішінен әр түрлі сандарын табыңыз. nn log*

тәртібіндегі әрекеттер саны. Шешімі. Сандарды сұрыптап, ал сосын әр түрлі сандарды есептеу керек

(тәртіп бойынша массив элементтерін қарап).

Тапсырма 5

n кесіндісі берілген ibia , тура ni ...1 максималды k табыңыз, длякоторого существует точка прямой, k кесіндісімен жабылған, тура нүктесі бар("қабаттардың максималды саны").

Әрекеттер саны - nn log* тәртібінде. Шешімі. Кесінділердің барлық сол жақ және оң жақ аяқ жақтарын белгілейік

(сол түзу нүктесінде орналасқан, сол жақ аяқ жағы оң жағына қарағанда қысқаболып келеді). Ары қарай солдан оңға қарай жылжып, қабаттар саның есептейміз.Кездескен сол жақ соңы қабаттар саның 1-ге арттырады,ал оң жақ азайтады.Белгілейік, бір біріне жақын келген кесінділер дұрыс өңделеді: ең бірінші сол жақсоңы келеді (оң жақ кесіндінің), ал сосын оң жақ (сол жақ кесіндінің).

Тапсырма 6Жазықтықта n нүктелері берілген. 1т - сынған бекітілмеген өздігінен қиыспаған түйінді белгілеңіз, барлық

нүктелерден өтетін. (Көршілес кесінділерге бір түзу сызықта жатуға болады) nn log*

тәртібіндегі әрекеттер саны.

Тапсырма 7Сол есеп, егерде сынған бекітілген болса.

Тапсырма 8 n жазықтығындағы нүктелер берілген. Олардың дөңес қаптамасын құрыңыз-

минималды дөңес фигурасы бар. (Резенке сақина, тақтайға шегеленген шегелергекиілген – олардың дөңес қаптамасы.) Операциялар саны nn log* .кем емес

Нұсқаулықтар. Нүктелерді реттейік – алдағы екі есепте қолданған тәртіптеркеле береді. Сосын, нүктелерді кезегімен қарастырайық.Қарастырылған нүктелердіңдөңес қаптамасын құрамыз (дөңес қаптаманы сақтау үшін деректер түрлері туралы6 тараудағы қараңыз).

Бақылау сұрақтары

1 AT -грамматикасында қандай атрибуттар қолданылады?2 Атрибут дегеніміз не?3 Қандай тарату грамматиканы - атрибуттық грамматика немесе AT -

грамматикасы деп атайды? 3-4 зертханалық жұмыс. Шекті айқындауыштар. Формальды тілдер және

грамматикалар. Орын ауыстырулар. Жиынтықтар. Айырулар

Мақсаты: Студенттерді деңгей бойынша бағдарлама құруын үйрету

1.1Қысқаша теориялық мәліметтерФормалдық тіл мен грамматиканы анықтауға қажет алғашқы және ең жай

түсінік болып алфавит пен алфавиттегі сөздер табылады.

Символдардың бұл қарастыруда бөлінбейтін соңғы жиыны сөздік немесеалфавит деп, ал жиынға жататын символдар - алфавит әріптері деп аталады.

Мысалы, әрбіреуі екі символдан тұратын }!,,,,{ A алфавиті 5 әріптіқұрайды, ал 11,10,01,00B алфавиті 4 әріпті құрайды.

Алфавит әріптерінің реті бұл алфавиттегі сөз немесе шынжыр деп аталады.Сөздегі әріптер саны A жиынының ұзындығы деп аталады. Бос шынжыр – бұлбірді-бір әріпі жоқ шынжыр. Оң жақтан немесе сол жақтан шынжырына кезкелген бос шынжырдың қосылуы шынжырын өзгертпейді

A алфавитінің символдарынан құрылған барлық мүмкін шынжыр жиындарынанықтау үшін A белгісі қолданылады.

Г формалды грамматика деп келесі төрт объектінің жиынтығы аталады: RIVVГ AT ,,, мұнда TV - терминалдық алфавит (сөздік); бұл алфавиттің

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

AV – терминалдық емес, көмекші алфавит (сөздік); бұл алфавиттің әріптерішынжыр құруда қолданыла алады; олар аралық шынжырға кіре алады, бірақ құрунәтижесіне кіргізілмейді; терминалдық емес символдарды белгілеу үшін латыналфавитінің жазба әріптерінен тұратын және бұрыштық жақшаларға алынған

идентификаторларды қолданатынымызды атап кетейік; I - грамматикасыныңбастапқы символы немесе аксиомасы- AVI

.

R –шығару ережелерінің жиыны немесе түрінің ережелерін тудыружиыны, бұнда және , AT VV алфавитінің әріптерінен құрылған шынжырлар6олар Г грамматикасының толық алфавиті (сөздік) деп аталады.

Грамматика ережелерінің жиынына сондай-ақ E түрінің оң жағы босережелер де кіреді. Ереженің оң жағы бос болғандықтан, қателік тудырмау үшін босшынжыр символын E түрінде белгілейміз. Грамматиканы шығару ережесішынжыр құру үшін қолданылады.

- Г грамматикасының ережесі және /// – символдар шынжыры,

оған қоса */// , AT VV . Онда /// шынжыры (яғни m -де

шынжырын ауыстыру) ережесінің көмегімен шынжырдан алынуы мүмкін. Бұлжағдайда шынжырынан тікелей шығарылған және білдіреді.

Егер ,...,, 10 шынжырының жиынтығы берілгенде келесі шығады 12110 ,...,,* онда мұндай реттік қатарды Г грамматикасында 0 –

дан шығару деп атап, *0 белгілейді. Г грамматикасының TV терминалдық алфавитінің соңғы шынжыр жиынын

алғашқы I символынан шығарамыз, ол Г грамматикасынан түған тіл деп

аталып, былайша ГL белгіленеді.

}**{ IVГL T

1мысал 1.1Г грамматикасы берілген,

IPIх ,,,,: 01.1 грамматикасы тудыратын тілді анықтауқажет.

Грамматика схемасында бір 5 ғана ереже бар, сондықтан 1.11.1 ГLГ бір

сөзінен ғана тұратын тілді тудырады.

2 мысал2.1Г грамматикасы берілген, және осы граммата тудыратын тілді анықтау

қажет.

CBCBCBBIP

CBAVVГ AT

,,,,

,,,,,:2.1

Берілген грамматикадағы барлық түйіндерді құрайық. Оны екі әдіспен істеуге

болады. Алдымен 1, 2, 4 ережелерін қолданамыз, ал содан соң 1 және 3 ережелерінқолданып екінші түйінді құрамыз.

Нәтижесінде

BI

CBI

аламыз.Яғни бұл грамматика тудыратын тіл ,2.1 L екі шынжырынан тұрады.

3 мысал 3.1Г грамматикасы берілген, және осы граммата тудыратын тілді анықтау қажет.

AAAAIP

VAIVГ TA

,10,10

,1,0,,:3.1

Келтірілген грамматика схемасының үш ережесі бар. Ереженің оң және солжақ бөлігінде екінші ереженің A терминалды емес символы бар.Сондайережелерді рекурсивті деп атайды. Терминалды емес A нүктесін белгілі біртізбеде қолдану, жаңа үлгідегі нүктені алуға мүмкіндік береді. Сонымен ереженің оңжақ бөлігінің A терминалды емес нүктесінің орнын бірнеше рет ауыстыруғаболады,ол әр түрлі ұзын тізбектерді жасауға мүмкіндік береді. Рекурсивті ереженіқолданудағы нәтиже шексіз болмау үшін, грамматика тізбесінде оң жағында A

символы бар бір ереже болу керек. Осындай ереже рекурсияны аяқтап, өткізілгентізбектен A нүктесін алып тастайды. Қарастырылған грамматикада нәтиженіаяқтау үшін A ережесі қолданылады. 3.1Г грамматикалық ережелер көмегімен

нәтижелерді құрастырып көрейік. Бірінші және үшінші ережелерді қолданғанда,мынаны аламыз: 0110 AI .

Бірінші, екінші және содан кейін үшінші ережені қолданғанда, шығатыннәтиже: .0011110010 AAI

Екінші ережесін бір рет қолданғанда, нәтижесінде нөлдер және

бірліктері бар тізбекшелер аламыз. 3.1Г грамматикасын тудыратын тілде

мүмкіндігінше тізбекшелері бар болады, онда нөлдер саны бірліктер санына тең.

1ТапсырмаЕкі , толық ауыспалыны аламыз.Бағдарлама кесіндісін құрастырыңыз,

оны орындағанннан кейін ауыспалымның мағынасы орындарымен өзгеріске түсуүшін (жаңа мағына ескі мағынасына тең, керісінше ). Шешілім. Қосымша толық ауыспалымды енгіземіз

:

;:

;:

Қосымшаның ауыстырылымсыз болу мүмкіндігі, жазамыз

:

;:

мақсатқа жеткізбейді ( ауыстырылымның бастапқы мағынасы айтарылымсызжойылады)

Алдынғы есепті шеш, қосымша ауыстырылымдарды қолданбай (толықауыстырылымдар мағынасы деп еркін толық сандарды атаймыз.)

2 ТапсырмаТолық a саны берілді (толық қайшы емес) n саны.

na азайту. Бағдарлама құрастыру керек, оны орындағанда a және n

ауыстырылымдар мағынасы ауыспайды, ал басқа да ауыстырылымдар мағынасы(мысалы b )

na тең болады. (Сонымен басқа да ауыстырылымдарды қолдануғаболады). Шешім. толық ауыстырылымын енгіземіз, ол 0 ден n –ға артады, қасиеті:

kab

:=0; :=1;{b=aвдеңгейіk}while k <> n do begin|k:=k+1;|b:=b*a;end;

Алдағы есепті шеш, егер де орындалған операторлар қабылдауының қызметтіксанын nlog тәртібінде шешу керек, сондықтан ол nC log аспау керек, кейбір C

константтары үшін; nlog -бұл деңгейге 2-ні енгізу керек, алу үшін n .

3 Тапсырма n...1 саннын барлық орын ауыстырымдарын басыңыз ( n ұзындылығының

реттілігін, оған 1 санының әр қайсысы бір рет кіреді). Шешім. Өзгертулерді массиве nxx ,...,1 массивінде сақтаймыз және

лексикографикалық тәртіпте тереміз. ( n...12 ауыстырылымы бірінші, ал 21...n

соңғы болады). Келесі ауыстырылымға көшуде алгоритмі құрастыруда сұрақтуындайды: қай жағдайда алдағыларды өзгертпегенде k ауыстырылымын арттыруғаболады ма? Жауабы: егер де келесі мүшелерден аз болса ( k нөмірлері бар мүшелеркөп). Біз көбірек k –ны анықтауымыз керек. Ол k , nxnxxkxkx ...1...1 .Одан кейін kx ең төменгі мүмкіндікпен арттыру керек. 1kx арасынан, ..., nx –ден көп ең төменгі санды табу керек. kx - пен ауыстырғанда, сандарды 1k

нөмірлермен орналастырамыз, ..., n ауыстырылым ең төмен болу керек, яғни өсутәртібінде.

Келесі ауысымға көшу алгоритмы.

{ <><n...2,1> }k:=n-1;{ x[k+1] >...> x[n]}төмендегі,k оң жақтағы реттілік while x[k] > x[k+1] do begin| k:=k-1;end;{x[k] < x[k+1] > ... > x[n]}t:=k+1;{t <=n, кесіндінің барлық мүшелері x[k+1] > ... > x[t] көп x[k]}while (t < n) and (x[t+1] > x[k]) do begin| t:=t+1;end;{x[k+1] > ... > x[t] > x[k] > x[t+1] > ... > x[n]}... x[k] и x[t] ауыстыру{x[k+1] > ... > x[n]}... x[k+1] ... x[n] кері тәртіпте орналастыру

Ескерту. Бағдарламада бізге таныс дефект бар: егер nt , онда 1tx

анықталмаған. Келесі ауыстырылымға модифицирланған алгоритмды көшіруде, ол өзі

аталған ауыстырылым ақырғы емес екенін тексеріп отыру керек. 4 ТапсырмаБарлық k -элементтері жиындар мен жиын асты болып саналсын n...1 . Шешім. nxx ..1 нөлдер мен n ұзындық бірліктерінің әр жиынтығын

реттілікпен ұсынамыз (ұсынудың басқа да түрін кешірек қарастырамыз).Осындай реттіліктерді лексикографиялық түрде белгілейміз. (жоғарыда қар.)

есепті шешудің тиімді түрі – барлық ауыстырылымдарды бұрынғыдай іріктеу болыпкеледі, ал сосын олардың арасынан k бірлігін таңдаймыз, ал қалғанын тиімді емесдеп санаймыз ( k бірліктерінің ауыстырылымдар саны басқа да ауыстырылымдар

санынан төмен болуы мүмкін). Біз кезекті ауыстырылым алу үшін n қызметіндегітәртібін талап ететін алгоритм іздестіру керек. Қандай жағдайда s - ауыстырылыммүшесін арттыру керек, алғашқыны ауыстырмағанда? Егерде sx 0 ден 1 ауысса,онда жалпы бірліктер санын сақтау үшін sx оң жағынан 1-ді 0 -ге ауыстырукерек. Сол үшін sx бірліктер оң жағынан болу керек. Егер де біз келесі реткекөшсек, онда sx нөл оң жақтан бірінші болу керек, одан кейін бірліктер тұру керек.

11 sx бірінші тұрғаның біз көріп тұрмыз ( sx бірінші емес екенін). Сонымен s –дан 11,0 sxsx көпті іздестіру қажет.

1sx –тен кейін бірнеше бірліктер тұруы мүмкін, ал одан кейін бірнеше нөлдер. sx –ті 1-ге ауыстырғанда, одан кейін келе жатқан бірліктерді сақтау керек және де

ол біздің тәртіп ретінен ең төмен реттілікте болу керек. Ең бірінші нөлдер ал сосынбірліктер тұру керек. Не шығатының көрейік:

бірінші реттілік 0...01...1 (n-k нөлдер, k бірліктер)соңғы реттілік 1...10...0 (k бірліктер, n-k нөлдер)х[1]...x[n] келесі реттілігінен алгоритмге көшу: s := n - 1;while not ((x[s]=0) and (x[s+1]=1)) do begin| s := s - 1;end;{s - мүше, 1-ден 0 –ге өзгертіуі мүмкін }num:=0;for k := s to n do begin| num := num + x[k];end;{num – бірліктер саны x[s]...x[n], нөлдер санытең (ұзындық – бірліктер саны), яғни (n-s+1) - num}x[s]:=1;for k := s+1 to n-num+1 do begin| x[k] := 0;end;{ num-1 бірлігін сонында орналыстыру керек}for k := n-num+2 to n do begin| x[k]:=1;end;

Жиынтықты көрсетудің басқа да түрі – олардың элементтерін есептеу. Әр жиынтық бір ғана мағынасы болу керек, элементтерді өсу тәртібінде есептейік. Мынадай есепке келеміз. Лексикографиялық тәртіпте n...1 санынан k ұзындығының барлық өсу реттілігін атап шығу керек. (Мысалы: 2,5 kn болғанда аламыз 12 13 14 15 23 24 25 34 35 45.)

5 ТапсырмаТолық оң сандар факториалын есептептеудің рекурсивті тәртібін жазыңыз

(яғни белгіленетін n...1 сандарын шығару).

Шешім. Теңсіздікті қолданамыз nnn !*1!,1!1 .

procedure factorial (n: integer; var fact: integer);| { n факториал санына тең fact қойыңыз}begin| if n=1 then begin| | fact:=1;| end else begin {n>1}| | factorial (n-1, fact);| | {fact = (n-1)!}| | fact:= fact*n;| end;end;

Процедура-функцияларды падаланып төмендегідей жазамыз:

function factorial (n: integer): integer;begin| if n=1 then begin| | factorial:=1; | end else begin {n>1}| | factorial:= factorial (n-1)*n;| end;end;

Функцияның ішкі сипатында factorial атынын екі жақтылықта пайдалануынаерекше көңіл бөліңіз ол айнымалы және шақырылатын рекурсивті функциялардыбелгілейді.Біздің жағдайда олар атынан кейін жақшамен айрылып тұр, ал егерфункция параметірсіз болса, қиын болатын еді. (Стандарттық, бірақ қиынтабылатын қателер болып тұрады, егер бағдарлама авторы айнымалы мағынасынпайдаланатын болса, онда компиляторды бұл жерде рекурсивті шақырылым ретіндекөреді).

6 ТапсырмаӘдетте факториалды екі нөлді анықтау үшін қолданылады, 1!0 деп

есептейді. Бағдарламаны сәйкесінше ауыстырыңыз.

7 ТапсырмаБағдарламаның рекурсивті көтерілуін толық кері деңгейде жазыңыз.

8 ТапсырмаҚажет болған жағдайда рекурсия терендігі nC log* аспаған жағдайда, онда n

– деңгей көрсеткіші.

9 Тапсырма

"Ханой мұңаралары" ойыны келесі кезеннен тұрады. Үш өзек бар. Олардыбіріншісіне N сақинасынан тұратын пирамида киілген.(үлкен сақиналары астынан,кішілері үстінен). Сақиналарды басқа өзекке ауыстыру керек. Сақиналарды өзектенөзекке ауыстырып отыруға болады, бірақ кіші сақинаның үстіне үлкендерін қоюғаболмайды. Әрекетті қажет ететін бағдарламаны құрастырыңыз.

Төменгі төбе түбір деп аталады.Әр төбеден екі сызық таралуы мүмкін: солғажоғары және оңға жоғары. Төбелер сызықтарынын баратын жерін төбелердіңбастапқы сол және оң жақ ұлдары деп атайды. Төбенің екі ұлы болуы мүмкін, кейкезде бір ұлы болады (сол және оң жақ). Оның ұлдары болмауы да мүмкін, бұлжағдайда оны парақ деп атайды.

x - екілік бұтақтын төбесі болсын. Ол өзі ұлдары, немерелері жәнешөберелерімен түбірінде x бұтағы бар - " x бұтақтар ұрпақтарын" құрайды.

Келесі есептерде бұтақ төбелері толық оң сандармен нөмірленген. Барлық төбелер нөмірлері әр түрлі болып келеді. Біздің ойымызша түбір

нөмірі root ауысымында сақталған. Екі жиым бар: Narrayr ...1:,1 of integer.

Төбенің сол және оң жақ ұлдарының i нөмірімен i1 и ir нөміріне сәйкесболып келеді. Егер төбе i нөмірінің сол және оң жақ ұлдары болмаса, онда i1

(сәйкесінше ir ) 0 тең. (Дәстүр бойынша бағдарламаларды жазғанда нөлдің орнынанөлге тең nil тұрақтылығы қолданылады).

Бұл жерде N – жеткілікті түрде натурал сан болып келеді (төбелердің барлықсандары N аспайды). Белгілейік, 1 ден N дейінгі барлық сандар төбелер нөміріболу міндетті емес және төбелер нөмірінің орналасуымен байланысты болмайды.(яғни l және r жиынтығындағы мәліметтер бөлігі- бұл қоқыс).

10 ТапсырмаN=7, root=3, l және r жиымдары мынадай: i | 1 2 3 4 5 6 7l[i] | 0 0 1 0 6 0 7r[i] | 0 0 5 3 2 0 7

Сәйкес бұтақты жазыңыз.

11 ТапсырмаБұтақтағы төбелер санының бағдарламалар есебін жазыңыз. Шешім. xn функциясын қарастырайық, x нөмір төбесіндегі түбірмен бұтақ

асты төбелер санына тең. 0niln (сәйкес бұтақтын бос), және де snil мазмұнынакөңіл бөлмейміз төбелер нөмірлеріне жатпайтын s сандары жатады. s үшінрекурсивтік бағдарлама мынадай:

function n (x:integer):integer;begin| if x = nil then begin| | n:= 0;| end else begin

| | n:= n(l[x]) + n(r[x]) + 1;| end;end;

Бұтақ асты төбелер саны x төбесінен оның ұлдары мен өзін қосқандағытөбелер санының сомасына тең. Рекурсия тереңдігі соңғы, себебі әр қадам сайынтиісті бұтақ асты биіктік төмендейді.

Бақылау сұрақтар

1 Сөздік және алфавит деп нені атаймыз?2 Г формальды грамматиканың анықтамасы нені білдіреді?3 Терминалды символ әріптері қандай?

5-6 зертханалық жұмыс. Жіктеу ағашы. Грамматикалардың эквиваленттілігіжәне бір мәнділігі.

Мақсаты: студенттерді сұрыптау алгоритмын шешу үшін әр -түрлі тәсілдітаба білуге үйрету

4.1 Қысқаша теориялық мәліметтерЖалпы алғанда аудару немесе таратуды алфавит сөзіндегі P және W сөздері

арасындағы сәйкестік деп білеміз. Егер *P тізбекшелері, *W тізбекшелері,

олар шығу және кіру тізбекшелері деп аталады. Егер P кіру алфавиті мен шығуалфавиті, онда W xL

тілінен аударғанда, *P жиынының тізбекшелерінен тұратын,выхL

, тілінде тізбекшелерден тұрады *W жиыны, C жиынының қос тізбекшелерідеп аталады , , олар вхL и выхL .

выхвх LиLC ,

Егер кіру және шығу алфавиті: dcbaP ,,, и 11,10,01,00W

үлгісінде берілсе, және кіру мен шығу тілдері 31 тізбекшелер ұзындығынқамтиды, олардың арасындағы сәйкестік аудару түрінде сипатталады.

1011,,0111,,0110,,0011,,0010,,0001,,11,,10,,01,,00, cdbdbcadacabdcbaC

Элементтер саны көп емес соңғы аударуларды аударылымдар түрінде беругеболады.Бірақта, үлкен соңғы және аяғы жоқ аударулар тапсыру үшін формальдытілдерге сияқты тапсырмалар керек. Бір жағдайды қарастырайық, жиынның кірутізбекшелері (аударудың C кіру тілін) Г грамматикасы арқылы және шығутізбекшелері арқылы беруге болады ( C аударымның шығу тілі).

Осындай тапсырманың аударымы болып, оның "айна сипатын шығутізбекшелері үшін анықтайды. Егер де шығу және кіру алфавиті екі символдан тұрса- 1,0 , онда осындай аудару ережесінің мынадай түрі бар:

Кіру тізбекшелері шығу тізбекшелері <I>╝0<I>, <I> ╝<I>0

<I> ╝1<I>, <I> ╝<I>1 <I> ╝, <I> ╝

Сәйкес ережені қолданғанда, мынаны аламыз:

100,001100,00100,000,0, IIIIIIII

Осындай құрылымды құрғанда кіру және шығу тізбекшелерінің құрылымережесі арасындағы сәйкестікке ерекше көңіл бөлу керек

Бұл тарауда бір есептін бірнеше нұсқаулары қарастырылады. n қалаларыболсын, 1 ден n сандар реттелген. Әр қалалар үшін I нөмірлерімен, j

кестесінде jia I қаласынан j қаласына жетудің авиабилет бағасы толық сансақталған. Әр қалалар арасындағы рейстер бар деп саналады. 0iia I барлық

ija , -дан jia айрылады. i ден j маршруттар үшін билеттер сомасыминималды болып саналады. (оның ішінде ауыстырып отырғызу), i ден j баратын(ол jia аспайды, және де кем болмау керек).

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

Мысалы Шамалап алғанда, бекітілген маршрут болмайды, олар үшін баға сомасы теріс

болып келеді. Бұл жағдайда ең төмен бағасы бар маршрут бар екенін дәлелдеу керек.Шешімі. n –нан көп маршрутта цикл болады, сондықтан миниумды n

ұзындығынан кем емес маршруттар арасынан іздеу керек. Барлық басқа есепте, бұл жағдай орындалған деп есептеледі (теріс сомамен

циклдар жоқ).

Тапсырма 1 0 уақытында 1 қаладан екінші қалаға барудың жол төлемінің ең төмен

бағасын табыңыз ( n 3 деңгейде).

Тапсырма 2 Бағдарлама дұрыс екенін дәлелде, егерде y жиымының болғызбаса, ал тек

қана сол жиымда x өзгерістерін шығарса (бағдарламадағы у әріптерін х әріпінеөзгертіп, ал сосын қалған керек емес жолдарды жою керек).

Тапсырма 3 Ең төмен жол төлемін табыңыз ji барлығы үшін ji, уақыт ішінде 0 ( n –ді

3 деңгейде).

Тапсырма 4

Барлық бағалар теріс емес екені бізге мәлім. Ең төмен жол төлемін табыңызi1 барлық үшін ni ...1 уақыт ішінде 0 ( n -ді 2 деңгейде).

Тапсырма 5 Бұл матрицаны шығару үшін матрица жай формула бойынша есептеледі, тек

қана сома орнына минимум, ал қосу орнына сома.

Тапсырма 6Сонымен матрицалардың белгілі түрде шығуы ассоциативті түрде болады.

Тапсырма 7Эквивалент жолының қысқалығы туралы есепте "ақырсыз деңгей" матрица

бағасы ,...**,*,: AAAAAAA , тізбектілігінде барлық элементтер, кейбіреуіненбастағанда,қысқа жол бағасының ізделетін матрицаға тең. (егер теріс циклдарболмаса).

Тапсырма 8 Қай элементтен бастап теңсіздік кепілдігін беруге болады, Алдынғы есепте? Әдетте (модифицирланған емес) матрицаларды көбейту пайдалы бола алады,

бірақта матрицалар басқа болу керек. Барлық рейстер болмасын (бұрынғыша), алкейбіреуі, jia тең 1,егер рейс болса және 0 , егер рейс болмаса. a матрицасынжасайық (жай күйде) k деңгейіне және оның ji - шы элементіне қарайық.

Тапсырма 9Дейкстр алгоритмы m рейстері мен n қалаларын модифицирлеу үшін

nknC log** операциялары керек екенін дәлелдеу керек. Нұсқаулық. Әр қадамда не істеу керек? Минималды бағадағы белгіленбеген

қаланы анықтау керек және барлық қалалар үшін маршруттары бар бағаларды түзетукерек. Егер де бізге қай қалаға баға минималды екенің айтып отырса, онда mnC *

қызметі жеткілікті болатын еді.

Тапсырма 10Сұрыптау алгоритмін ұсынайық. Іс-әрекет саны nn log тәртібінде болсын,

nnC log** аспау керек. Кейбір C үшін және барлық n үшін. Біз бір шешімін көрсетеміз. Шешім. (қосылу арқылы сұрыптау).

k саны- толық оң сан. Разобьем массив nxx ...1 массивін алайық, k

ұзындығының кесіндісіне. ( kxx ...1 бірінші, ал сосын kxkx 2...1 және т.б.)Соңғы кесінді толық болмайды, егер де n – k -ға бөлінбесе. k массивін –реттелгендеп атайы, егер де әр кесінді жеке алғанда реттелген болса. Әр массив 1- реттелген.Егер де k массиві- реттелген болса және kn , онда ол реттелген.

Біз k - реттелген масссивті k2 - реттелген массивке қалай түрлендіругеболатының көрсетейік (сол элементтерден сияқты). Бұл түрлендіру нәтижесіндеалгоритм былай жазылады:

k:=1;{x массиві k- реттелген болып келеді}while k < n do begin| .. k- реттелген массивті 2k-реттелген массивке түрлендіру керек;| k := 2 * k;end;

Талап ететін түрлендіру, біз бірнеше рет екі реттелген кесінді ұзындығын k

көп рет бір реттелген кесіндіге "тұтастырамыз". Біріктіру процедурасы egerrqp int:,, при rqp кесінділерді біріктірейік

qxpx ...1 и rxqx ...1 реттелген кесіндіге rxpx ...1 ( x массивтін басқабөліктеріне тиіспей).

Ендеше k - реттелген массивті k2 -реттелген массивке түрлендірутөмендегідей жүзеге асады:

t:=0;{t қысқаша 2k немесе t = n, x[1]..x[t] болып келеді2k-реттелген; x массивтін қалдығы өзгермейді}while t + k < n do begin| p := t;| q := t+k;| ...r := min (t+2*k, n); {min(a,b) - a немесе b минимумы}| бірігу (p,q,r);| t := r;end;

Бірігу – бірігу нәтижесін жазу үшін көмекші массивті қажет етеді, оларды b

деп белгілейік. 0p немесе 0q арқылы соңғы элементтер жерінің нөмірлерін(бірігуге қауіпі бар), 0s – соңғы массивке жазылған b элементі. Бірігуде әр қадамсайын екі әрекеттін орнына біреу ғана жасалады істін:

b[s0+1]:=x[p0+1];p0:=p0+1;s0:=s0+1; немесеb[s0+1]:=x[q0+1];q0:=q0+1;s0:=s0+1;

(C тілін жақсы көретіндер 00 pxsb қысқартуын бағалайды немесе 00 qxsb .)

Бірінші әрекет (элементті бірінші кесіндіден алу) бір уақытта екі әрекеттіорындағанда шығуы мүмкін:

1 бірінші кесінді аяқталған жоқ ( qp 0 ); 2 екінші кесінді аяқталды () немесе аяқталған жоқ, бірақта оның ішінде

элемент аз болады (екінші кесіндіге қарағанда) rq 0 и 101 qxpox

Екінші әрекет үшін ұқсас. Сонымен мынаны аламыз

p0 := p; q0 := q; s0 := p;while (p0 <> q) or (q0 <> r) do begin| if (p0 < q) and ((q0 = r) or ((q0 < r) and| | (x[p0+1] <= x[q0+1]))) then begin| | b [s0+1] := x [p0+1];| | p0 := p0+1;| | s0 := s0+1;| end else begin| | {(q0 <<q) and| | (x[p0+1] > r) and ((p0 = q) or ((p0= x[q0+1])))}| | b [s0+1] := x [q0+1];| | q0 := q0 + 1;| | s0 := s0 + 1;| end;end;

(Егерде екі кесінді аяқталмаған болса онда таңдалмаған бірінші элементтерітең болып келеді, бұл жағдайда екі әрекетті де қабылдаймыз; бағдарламада біріншісітаңдалған.)

Бірігу нәтижесін қайтадан x – ке жазу керек. (алдын ала ескерту). Егерде керікөбейту бірігу процедурасынан тыс жасалса, онда соңғы кесіндіні жазуғаұмытпаңыз.)

Бағдарлама біріншілік кемшілігі бар: бульдік өрнекті есептеу элементтін жоқмассивтеріне ұсыңылады.

Екінші шешімді өздігінен тап.

Бақылау сұрақтары

1 Алгоритм дегеніміз не?2 Сұрыптау алгоритмі дегеніміз не?

7 зертханалық жұмыс. Контекстік-еркін грамматикалық және магазиндікавтоматтар. Бұтақты айналу. Қайтарылымдармен толығу

Мақсаты: Студенттерді бағдарламаны кезеңмен құруға үйрету

2.1 Қысқаша теориялық мәліметтерФормалдық грамматика теориясында 4 тіл түрі сәйкес келетін грамматиканың

4 түрі ерекшеленеді. Бұл грамматикалар грамматика ережелеріне шектеу қоюжолымен анықталады.

Жалпы түр грамматикасы деп айтылатын 0 түріндегі грамматикалар тудыруережелеріне ешқандай шектеу қоймайды. Кез келген ережесі

*, AT VV еркін шынжырындық көмегімен құрылуы мүмкін.

Мәнмәтінді – бағыныңқылы грамматика деп аталатын 1 түріндегіграмматикалар кез келген ережені қолдануға жол бермейді. Бұндай грамматикаларда шығару ережесі келесі түрде болуы керек:

2121 A

бұнда 2,1 - *AT VV

жиынынан мүмкін бос шынжырлар, AVA символ және

*AT VV шынжыр. 1 және 2 шынжырлары ережені қолданғанда

өзгермейді, сондықтан оларды мәнмәтін (яғни сәйкесінше оң жақ және сол жақ), алграмматиканы – мәнмәтінді бағыныңқылы деп атайды.

1 түріндегі грамматика 0 түріндегі грамматикаға қарағанда көбірекқолданылады, себебі ереженің оң жағында кейбір синтаксистік түсініктерменбайланысты болатын терминалды емес бір ғана символ өзгертіледі, ал 0 түріндегіграмматикада бірден бірнеше символ, соның ішінде терминалды да өзгертугеболады.

Мысалы,

:5.1Г

},,{},,,,{ BAIVV AT

,{ IAIP , IAAIA

, ABAAAA, A

, AAB

} I

грамматикасы мәтіндік-бағыныңқылы болып табылады, себебі екінші жәнеалтыншы ережелер бос емес оң жақты мәнмәтінді, ал үшінші және бесінші ереже екімәнмәтінді де ұстайды. Бұндай грамматикада шығару төмендегідей болуы мүмкін:

IIAIAAIAI

2 түріндегі грамматиканы мәнмәтінді – бос және мәнмәтінсіз грамматика ( МБ

-грамматика немесе М грамматика) деп атайды. бұндай грамматикаларды шығаруережесі келесідей болады:

AVAA , және *AT VV

Яғни бұл ережелер 21 шарты бойынша 1 түріндегі грамматикаережесінен пайда болады. Мәнмәтіндік шарттар болмағандықтан, 1 түріндегіграмматика ережесіне қарағанда МБ – грамматика ережесі жеңілдірек алынады.Яғни, нақты осындай грамматикалар бағдарлама тілдерін мазмұндау үшінқолданылады. МБ – грамматикаға мысал ретінде төмендегі грамматиканы келтіругеболады:

,,,:6.1 IVVГ AT },,,{ IIIIIIP

Бұл грамматика *TV шынжыры немесе шынжырының айналыкөрінісінің әрбіреуі екі бөлігінен тұратын шынжырдан тұратын тілді тудырады.

TVГL /

6.1

бұнда

TV - бұл *TV бос шынжырсыз жиыны. Бұл грамматика көмегімен мысалғакелесі шынжыр құруға болады:

IIII

3 түріндегі грамматика автоматты грамматика ( A -грамматика) деп аталады.Бұндай грамматикаларда шығару ережелері келесі түрде болады:

A немесе BA немесе BA

бұнда ,TV және AVBA , және грамматика тек қана BA - оң жақереже немесе BA – сол жақты ереже түріндегі ережесі болуы мүмкін.

Бұл грамматикалар бір тілді тудырады.

Тіл классификациясы тілді тудыратын грамматика түрлеріне сәйкес құрылуымүмкін. Бір тіл екі түрлі грамматика болатын түрлі грамматикалармен берілуімүмкін. Сондықтан тіл түрін 1k түріндегі грамматика беруі мүмкін грамматикатүрімен анықталады.

Тапсырма 1Ферзи, бір - бірін соқпайды: бұтақ орнын тексеру. Бірінші бөлімде біз бір үлгідегі бірнеше есептер қарастырғанбыз: "Кей A

жиымның барлық элементтерін атап шығыныз". Шешім сызбасы мынадай: A

жиымында белгілі тәртіп енгізілді және бастапқы элементтін A келесі жиымынанкейінгі тұрған элементі( сол тәртіпте) көрсетіледі. Осындай сызбаны әрқашантікелей іске асыруға мүмкін емес. Бұл тарауда біз кей жиымның барлықэлементтерін анықтауға мүмкіндік аламыз. Оның аты "қайтарылымдарды іздестіру","тармақтар мен шекаралар әдісі ", "backtracking". Біздің ойымызша бұл әдістің нақтыанықтамасы – бұтақты айналып шығу.

Тапсырма 2 n ферзидерді шахматтық тақтасында n ді n - ға қойғандағы барлық

әдістерін анықтаныз (олар бір –бірін соқпаған жағдайда) Шешімі. Әр n горизонтальнда бір ферзидан тұру керек. K –ны позиция

дейміз - ( 0k , үшін n,...,1 ) ферзилердің k төменгі горизонтында (ферзилар бір-бірін соғуы мүмкін). Салайық "бұтақ орыны": оның түбірі 0-орыны болады, әр k -орынан n жоғары қарай көтерілейік 1k - орынына. Бұл n орындарыферзилардың 1k -ші горизонталында орналасумен ерекшелінеді.

Олардың суретте орналасуы бұл ферзидің қосымшаға сәйкес екенің көрсетеді:ферзи сол жақта орналасса сол жақ орыны деп аталады.

Бұл бұтақтың орындары арасынан біз n -орынына көңіл бөлуіміз керек жәнеферзилар бір-бірін соқпау керек. Бағдарлама оларды "бұтақты айнала жүреді" жәнеоларды іздестіреді. Артық жұмыс істемеу үшін, мына нәрсені ескерейік: егер де k -орынының ферзилері бір-бірін соқса, онда қалған ферзилерді қоюдың мағынасыжоқ.

Сондықтан, осы жағдайды көргенде біз бұл бағыттағы бұтақтың құрылымынтоқтатамыз.

Нақтырақ, k -орының жетімді дейміз, егер жоғары ферзиді жойса, қалғандарыбір-бірін соғады. Біздің бағдарлама рұқсат етілген орындарды ғана қарастырады.

Есепті екі бөлікке бөлейік: (1) бұтақты ерікті айналамыз және (2) бұтақтардырұқсат етілген орыннан іске асыру.

Ерікті ағашты айналудың есебін құрастырайық. Бізде робот бар деп есептейік,ол әр ауқыт сайын бұтақтын төбесінде орналасуы мүмкін.

Ол берілген тапсырмаларды орындай біледі:

жоғары солға (жоғары бағдаршадан шығатын сол жақ бойынша)оңға (көрші оң жақтағы төбеге көшу)

төмен (бір деңгейге төмен түсу)жоғары солға оңға төмен

Әр команданы сәйкесінше орындау үшін "жоғары бар", "сол жақта бар","төмен бар" (соңғы тексеру барлық жерде тиімді, түбірден басқасы). Көңіл бөліңіз,"оңға" командасы тек қана "туған ағасына" ғана көшуге мүмкіндік береді.

Роботта "өңдеу" деген командасы бар оның міндеті – барлық парақтарды(биіктік, оларды ішінде жоғары бағдаршасы жоқ, "жоғары бар ").

Біздің шахматтық есебін шығару үшін команда ферзи орынындағы басылыммен тексерісі сәйкесінше өңделеді.

Бағдарламаны ары қарай дұрыс қолданудың мынадай анықтамасы беріледі.Роботтың бір бұтақтын төбесінде жағдайын бекітсін.Сол жағдайда бұтақтын барлықпарақтары үш категорияға бөлінеді: Робот үстінде, Роботтан солға қарай жәнероботтан оңға қарай. (Түбірден параққа Роботпен төбе арқылы өтеді, солға қарайбұрылу, оған жетпей оңға қарай бұрылу.) (ОЛ) арқылы жағдайдыбелгілеймі"Роботтан солға қарай барлық парақтар өңделген ", а (ОЛН) арқылы -жағдайы "барлық парақтар солға қарай және Робот үстінде өңделген". Бізге мынадай процедура қажет:

procedure тірелгенге дейін жоғары және өңдеу| {берілген: (ОЛ), керек: (ОЛН)}begin| {инвариант: ОЛ}| while жоғарыда бар do begin| | жоғары солға;| end| {ОЛ, Робот парақта}| өңдеу;| {ОЛН}end;

Негізгі алгоритм: берілген: Робот түбірде,парақтары өңделмеген керек: Робот түбірде, парақтары өңделген

{ОЛ}тірелгенге дейін жоғары және өңдеу;{инвариант: ОЛН}while төмен бар do begin| if оң жақта бар then begin {ОЛН, оң жақта бар }| | оңға;| | {ОЛ}| тірелгенге дейін жоғары және өңдеу;

| end else begin| | {ОЛН, оң жақта емес төмен жақта}| | төмен;| end;end;{ОЛН, Робот түбірде=> барлық парақтар өңделген}

Роботтың келесі қасиеттерін пайдалану ғана қалды. (жоғары қарай шарттарыкөрсетілген, онда төмен-оны орындау нәтижесі туралы анықтама командасыорындалады): (1) {ОЛ, жоғары емес} (2) {ОЛ}жоғары солға өңдеу{ОЛН} {ОЛ}(3) {оң жақта бар, ОЛН} (4) {оң жақта емес ОЛН}оңға қарай төмен{ОЛ} {ОЛН}

Тапсырма 3 Көрсетілген бағдарлама жұмысты аяқтайтының дәлелдеу керек (соңғы

бұтақтын қайсысында болсын).

Тапсырма 4Бұтақты айналудағы есепті шығар, егер де біз барлық төбелер өңделетінің

қаласақ (парақтар ғана емес). Шешімі. x – кейбір төбелер. Сол жағдайда y төбесі төрт категорияның біріне

жатады. Түбірден у баратын жолды қарастырайық. Болуы мүмкін:

1 (а) x –тен түбірге баратын жол ( x тен төмен); 2 (б) x -ке баратын жолдан солға бұрылу ( x -те солға қарай); 3 (в) x арқылы өту( y над x -тен y -ға); 4 (г) жолдан оңға x -ке бұрылу ( x -тен y –ға қарай); x төбенін өзі k категориясына жатады (в).

Шарттар енді осындай болады: (ОНЛ) барлық төбелер төмен және солға орналасқан; (ОНЛН) барлық төбелер төмен, солға және үстінде орналасқан.

Бағдарлама осындай болады:

procedure тірелгенге дейін және жоғары;| {берілген: (ОНЛ), керек: (ОНЛН)}begin| {инвариант: ОНЛ}| while жоғарыда бар do begin| |өңдеу;

| | жоғары солға;| end| {ОНЛ, Робот парақта}| өңдеу; {ОНЛН}end;

Негізгі алгоритм: берілді: Робот түбірде , ештене өңделген жоқ керек: Робот түбірде, барлық төбелер өңделген{ОНЛ}тірелгенге дейін жоғары және өңдеу;{инвариант: ОНЛН}while төменде барdo begin| if оң жақта барthen begin {ОНЛН, оң жақта бар}| |оңға;| | {ОНЛ}| | тірелгенге дейін жоғары және өңдеу;;| end else begin| | {ОЛН,оң жақта емес, төменнен}| | төмен;| end;end;{ОНЛН, Робот түбірде => барлық төбелер өңделген }

Тапсырма 5 Көрсетілген бағдарлама, төбені тек қана оның ұрпақтары өңделгеннен кейінғана өңдейді.Бағдарламаны қалай өзгерту керек,әр төбе, парақ болмайтын жағдайдаекі рет өңделу үшін: өз ұрпақтарынан кейін ал сосын оған дейін. (Парақтарбұрынғыша бір рет өңделеді.)

Тапсырма 6 Бұл бағдарламадағы операциялар саны бұтақ төбесінің санына тең. (Басқабағдарламаларда сияқты, олар командаларды жіберу мен және кей командаларды"өңдеу"шектелмейді.)

Нұсқаулық. Бұл бағдарламаны орындағанда әр ретте екінші әрекет –төбелердіөңдеу,ал әр төбе кем дегенде екі рет өңделеді.

Тапсырма 7 Бұтақты айналу әдісі келесі тапсырмаларды қолдану үшін пайдалынады:

жиым берілген . n –нан толық naa ...1 оң сандардан тұрады және s санынан;білуіміз керек, s саны жиым санының a сомасы ретінде көрсетілуі керек пе? (Әрсанды тек қана бір рет пайдалануға болады.)

Шешімі. k бульдік мағыналардан k -орынына тізбелікке жол береміз, бұлмағыналар kaa ...1 сома санына кіре ме немесе жоқ па? Бұл ұстаным дұрыс егердесома s -тен аспаса.

Ескерту. Барлық жиынтықты толық алып салыстырғанда ( n деңгейінде 2 ) кейжерде біз ұтамыз. a жиымын азаю тәртібінде алдын ала сараптауға болады., жәнеде s пен барлық мүшелердің айырым сомасы алып тасталған мүшелер сомасынанкөп болып келеді. Соңғы қабылдауды "тармақ және шекара әдісі"деп атайды.Бірақта толық қамтумен салыстырғанда жақсы нәтиже жоқ. Бұл есептін дәстүрліаты- " рюкзаке туралы есеп" (жалпы жүк көтеруші s рюкзагін түйінге байлау керек,салмақты нақты білгенде naa ...1 ). Және 7 тарауда қараңыз ( динамикалықбағдарлама туралы бөлім ) оның шешілім алгоритмы, sn полиномиалды бойынша.

Тапсырма 8 n нөлінен, бірліктен және екіліктен шығатын тізбектілікті анықтаныз, және деоның ішінде цифрлар тобы екі рет қайталанбау керек ( XX бөлігінің түрі жоқ).

Бақылау сұрақтары

1 Қандай символ өңдірмейтін деп аталады?2 Қандай символ қол жетпейтін деп аталады?3 n –ді n –ға шахматтық тақтада n ферзиді қою тәртібін анықтаныз және

олар бір-бірін соқпау керек.

8 зертханалық жұмыс. Төмен түсетін және өрлеме айырылымдары.Сұрыптау. Квадраттық алгоритмдер

Мақсаты: Студентерді бағдарламаны кезеңмен құруға үйрету

3.1 Қысқаша теориялық мәліметтерТерминалданбаған дүкендік танушылар жұмысының модельденуі реттіліктің

бастауыш жай-күйден соңғы жай-күйге ауысуын іздеумен байланысты. Іздеу жеке-жеке қадамдардан тұрады.

Және олардың әрбіреуі сәтсіздікке және бастапқы жай-күйге әкелуі мүмкін.Бұндай іздеу уақытты көпалатындықтан тәжірибеде қайтымсыз жұмыс істейтіндетерминалданған танушыларды қолданады. Бұл танушылар МБ -тілдердің шектеулікластарын ғана қолданысқа жібереді, бірақ олар бағдарламалау тілдерінің барлықсинтаксистік жақтарын көрсетеді.

Танушыларды азаймалы және өрмелі деп екі категорияға бөлуге болады.Азаймалы танушылар ережелерді жоғарыдан төмен өңдейді, яғни жоғары

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

түріндегі грамматикалар тудыратын азаймалы танушылар қарастырылады.

LL атауы Left сөзінен шыққан, себебі анализатор кіріс шынжырын солдан –оңға қарай көреді. Тәжірибеде көбінесе 1LL грамматика класы қолданылады.Олар үшін ағымды позицияда орналасқан детерминалданған бір кіріс символдытанушылар жұмыс істейді. Оқудың бірінші қадамы ретінде азаймалы танушылардың

1LL грамматика кластары ішіндегі бір реттілікті қараймыз.

Бөлінген ауыспалылар.Құрамында жою ережелері жоқ мәнмәтінді-бос грамматика төмендегі келесі

екі шартты орындаса ғана бөлінген немесе жай деп аталады: 1 Әр ереженің оң жағы терминалмен басталса.2 Егер екі ереженің сол жағы бірдей болса, онда бұл ережелердің оң жағы

түрлі терминалдық символдармен басталуы керек. Бөлінген грамматиканың негізгі қасиеттерінің бірі – олардың әрқасысына

өрлемейтін детерминалданған танушы құруға болады.

Мысалы, келесі грамматика, сызбамен берілген:

BBBIBIBIRГ ,,,:0.3

бөлек грамматика болып келеді, (1) и (2) жағдайы орындалуда. Басқа жақтан алғанда, грамматика

BBBIBIBIRГ ,,,:1.3

бөлек грамматика болмайды , себебі (2) ережеде шарт бұзылады (1), ал ережесінде(3) және (4) - шарт (2).

Бөлек грамматиканың негізгі қасиеті болып, олардың әрқайсысынандетерминалды төмен түсетін айырылымдарын құруға болады.

Мысалы Ханой мұнараларындағы есепте сақиналардың қозғалу бірізділігін табу үшін

рекурсивті емес бағдарламаны жазвңвз. Шешімі. Рекурсивті бағдарламаны еске түсірейік, i -ді ауыстырып қоятын

жоғарғы сақиналары с m нен n :

procedure move(i,m,n: integer);| var s: integer;begin| if i = 1 then begin| | writeln ('қадам жасау ', m, '->', n);| end else begin| | s:=6-m-n; {s – үшінші өзек: нөмірлер сомасы 6 тең}| | move (i-1, m, s);| | writeln ('қадам жасау ', m, '->', n);| | move (i-1, s, n);

| end;end;

Біз көретіндей, " n -ші өзекке m-нің жоғарғы дискін i –ге ауыстыру" nmi ,,

есебі сол үлгідегі үш есепке әкеледі: екі есепке i -1 дисктермен бір есепке жалғыздискпен.Бұл есептермен айналысқанда, тағы не істеу керек екенін ұпытпау керек.

Бұл үшін қалтарылған стек есептерін жасайық.Олардың элементтеріүштіліктер болып келеді.Әр үштілік тапсырыс ретінде интерпретациаланады"жоғарғы i дисктерін m -ші өзектен n -ге ауыстырылсын" qpjnmi ,,,, .Тапсырыстар олардың орындалу талаптарына сәйкес жасалған: ең жедел – стекбиіктігі.Мынадай бағдарлама аламыз:

procedure move(i,m,n: integer);begin| стек тапсырыстарын бос істеу| стекқа үштілікті қою | {инвариант: стектағы тапсырыстарды орындау қалды}| while стек непуст do begin| | жоғарғы элементті жою,оны | | if j = 1 then begin ауыстыру| | | writeln ('қадам жасау', p, '-><j-1,s,q>', q);| | end else begin| | | s:=6-p-q;| | | {s – үшінші өзек: номерлер сомасы 6 тең}| | | стекқа үштерді қою , <1,p,q><j-1,p,s>, | | end;| end;end;

(ең бірінші стекке үш қойылады, оны соңғы кезде орындау керек). Стек үштіліктері жеке стектері ретінде іске асады. (Сонымен қоса, паскальдің

арнайы түрі бар, оны "жазылу" деп атайды). Тапсырма 1 (А.К.Звонкин Анджея Лисовскиге хабарлады). Ханой мұнаралары туралы

есептерде рекурсивті емес алгоритмдер бар. Олардың бірі: қондыру өзектері ( ауыстырулардан емес) барлық өзектер кезек

бойынша болу керек . Келесі ереже: кезекпен ең аз сақиналарды және ең аз емессақиналарды ауыстыру,сонымен ең азын шеңбер бойнша.

Тапсырма 2 Рекурсия орнына стекті қолдану. Толық санның ондық басылымның

рекурсивті бағдарламасында тапсырмалар кейінге қалдырылған.

Тапсырма 3

Екілік бұтақ төбелерінің барлығын жазатын рекурсивті емес бағдарламаныжазыңыз.

Тапсырма 4Не өзгереді, егерде бұтақтын екілік төбелерін жазбасақ, бірақта оның саның

есептесек? Тапсырма 5 6 мүмкіндігі бар тәртіптер үшін кей жеңілдіктер болуы мүмкін, екі түрдегі

стек элементтерінде керек емес сақталымдарды жасайды. Кейбіреулерін көрсетейік. Ескерту. Бұтақтын барлық төбелерін жазудағы басқа бағдарламасын бұтақты

айналу бағдарламасы негізінде құруға болады (тиісті тарауда қарастырылған) Онда"төмен" ji, командасы орындалады. Енді барлық төбелер тізімін түбірденағымдағы төбеге бару жолын сақтау керек Сонымен қоса графтағы алгоритмдартуралы тараудан қараңыз.

Тапсырма 61 naa ,...,1 – толық сандар болсын. 1b жиымын құрастыру керек, ..., nb ,

ол үшін nbb ...1 сондай сандар болу керек. Ескерту. сандар арасында naa ,...,1 тең болуы мүмкін. Әр толық сан

nbb ...1 қанша рет кірсе, naa ,...,1 да кіру керек. Шешімі. Санауға онай, naa ,...,1 мен nbb ...1 сандары x жиымының

бастапқы және соңғы мағынасын білдіреді. Талаптар " a және b бір сандарды талапетеді" көре тұра орындалады, егерде x элементтерінің орынын ауыстырупроцесімен шектелсек.

k := 0;{ x жиымының k аз элементтері өз орындарында орналасқан}while k <> n do begin| s := k + 1; t := k + 1;| {x[s] - арасында ең азы... x[k+1] x[t] }| while t<>n do begin| | t := t + 1;| | if x[t] < x[s] then begin| | | s := t;| | end;| end;| {x[s] – ең аз x[k+1]..x[n] }| ... ауыстыру x[s] и x[k+1];| k := k + 1;end;

2 Инвариантты қолданатын, сұрыптау есебіне басқа шешім беру керек.{первые k элементтін біріншісі реттелген: kxx ...1 }

Бақылау сұрақтары

1 Рекурсивті емес бағдарламаны қалай құру керек?2 Не өзгереді, егер де екілік бұтақтын төбесін баспаса, ал тек қана оныңсаның санаса? 9-10 зертханалық жұмыс. Шекті айқындауыштардың эквиваленттілігі

және бірмәнділігі. Контексті-тәуелсіз грамматикаларды келтіру.

Мақсаты: Студентерді бағдарламаны кезеңмен құруға үйрету

6.1 Қысқаша теориялық мәліметтер Бойер-Мура алгоритмы. Бұл алгоритм жасауға мүмкін емес нәрселерді істейді: ұқсас жағдайда ол

сөздердің бір бөлік әріптерін ғана оқиды. Бұл қалай болуы мүмкін? Өте жеңіл.Мысалы біз " abcd " үлгісін іздестірейік.

Сөздің төртінші әріпіне қарайық: егерде ол " e әріпі болса", бірінші үш әріптіоқу қажеттілігі жоқ. (Негізінде " e " әрпі үлгісінде жоқ, сондықтан ол бесіншіәріптен кейін ғана басталады).

Біз осы алгоритмнің ең оңай вариантын көрсетейік, бірақта ол барлықжағдайда жұмыстың шапшандығына кепілдік бере алмайды nxx ...1 болсын - үлгі,оны іздеу керек. s символдың әрқайсысы үшін, оның X сөзінде дұрыс көтерілуінтабайық яғни k , skx тең болған жағдайда. Бұл мәліметтер spos массивіндесақталады, егерде s символы кездеспесе, онда бізге 0spos қоюға ыңғайлыболады (неге екенің төменде көреміз).

Мысалыpos массивін қалай толтыру керек?

Шешімібарлық pos[s]қойыңыз б тең 0 болғандай for i:=1 to n do beginpos[x[i]]:=i;end;

Іздеу үдерісінде біз last ауысымын сөздегі әріпті сақтаймыз, үлгінің соңғыәрпі тұрғанға қарсы. nlast басында (үлгі ұзындығы), ал сосын біртіндеп өседі. last:=n;{Қалған барлық үлгі жағдайлары тексерілген}while last <= m do begin {сөз аяқталған жоқ}| if x[m] <> y[last] then begin {соңғы әріптері әр түрлі}| | last := last + (n - pos[y[last]]);| | {n - pos[y[last]] – бұл үлгінің минималды түрде жылжығаны,| | керісінше y[last] сол қалыпында қалады| | үлгідегі әріп. Егер сондай әріп болмаса,

| | онда үлгінің барлық ұзындығын жылжытамыз}| end else begin| | егерде кейінгі жағдайы келіп тұрса,| | x[1]..x[n] = y[last-n+1]..y[last],| | онда сәйкестікті хабарланыз;| | last := last+1;| end;end;

Білгіштер сәйкестікті оңнан солға қарай өткізуді ұсынып отыр. Яғни үлгініңсоңғы әрпінен бастау керек (онда сәйкестіктер болу керек).

Бұл алгоритмнің әр түрлі модификациясы болуы мүмкін.Мысалы, 1: lastlast жолын )(: UTlastlast жолына ауыстыруға болады,

онда U – координаттары nx екінші оң жағындағы шығу әріптері. Осыны бағдарламада қалай ескеруге болады? Шешімі. pos кестесін құрғандаfor i:=1 to n-1 do... жазыңыз (ары қарай бұрыңғыша), ал негізгі бағдарламада

1: lastlast орнына lastyposnlastlast : жазыңыз;Келтірілген Бойер - Мура алгоритмнің жеңіл түрі кей жағдайда n әрекетін

көбірек талап етеді. ( mn сандар әрекетінің тәртібі), Кнута - Моррис – Праттаалгоритмінен кішкене ғана жеңіліп қалдық.

Тапсырма 1Жағдай мысалын келтіріңіз, оның ішіндегі үлгі сөзге кірмейді, бірақта оны

белгілеу үшін, алгоритм mn әрекетіндегі тәртіпті талап етеді. Нақты (жеңілдетілмеген) Бойера - Мура алгоритмі кепілденеді, әрекеттер

саны )(* nmC аспайды. Ол Кнут-Моррис-Пратта алгоритмінің идеяларына жақын,идеялар пайдаланады. Оңнан солға жүргенде біз кірген сөзбен үлгінісалыстырайық. Кейбір Z бөлігі (үлгінің соңы болып келген) тең келді, ал сосынайырмашылығын таптық: үлгіде Z алдында кіру сөзіндегідей емес болыпкеледі.Бұл кезде кіру сөзі туралы не айтуға болады? Оның ішінде Z тең үзіндітабылды, ал оның алдында үлгідегі емес әріп тұр. Бұл ақпарат үлгіні бірнеше ретоңға қарай жылжытуға мүмкіндік береді және деоның кіруіне еш кедергі болады.Бұл жылжытуларды Z үлгінің әр соңы үшін алдан ала есептеп алған жөн.Ғалымдардың айтуынша, бұнын барлығы (жылжудың кестесін және оныңқолдануын есептеу) )(* nmC әрекетіне қоюға болады.

Тапсырма 2Деңгейге шығару мәтінінде қатар орналасқан екі жұлдызша мен белгіленген.

Бұл белгіні '^' ауыстыруға шешім қабылданды (сонымен ' yx ** ' ауысады ' yx^ ').Осыны қалай жай түрде жасауға болады?

Бастапқы мәтін символдан кейін символды оқиды, алынған мәтінді символданкейін символды қосып басу керек.

Шешімі. Әр уақыт сайын бағдарлама екі жағдайдың бірінде болып келеді"негізгі" және "жұлдызшадан кейін"

Кезекті жаңа әрекеттін жағдайы. кіру символының жағдайы негізгі * жоқтан кейіннегізгі x <> '*' негізгі x басусосын * негізгіні басу '^' x кейін<> '*негізгіні * x басу

Егер мәтіннің соңында бағдарлама «кейін» жағдайында болса, ондажұлдызшаны басу және жұмысты аяқтау керек.

Ескерту. Біздің бағдарлама заменяет '***' '^*' ауыстырады (бірақта '*^' емес).Есептеу жағдайында біз кей детальдарды талқылаған жоқпыз - бағдарлама "дұрысәрекет істеу керек". Аталған уақытта,бағдарламаның қалай жұмыс жасайтыныңтүсіндірудің ең тиімді жолы бұл оның жағдайы мен әрекетін бейнелеп беру.

Тапсырма 3Мәтіннен барлық сөдердің ' abc ' түрін жоятын бағдарламаны жазыңыз.

Тапсырма 4 Паскальда түсініктемелер бейнелі жақшалармен келтірілген: begin { циклбасы} 1: ii ; { i ді 1арттырамыз}

Бағдарламаны жазыңыз, ол түсініктемелерді жойып, ал жойылғанның орнынааралықты қойсын ('1{бір}2' ауыссын, '12' емес, ал '1 2').

Шешімі. Бағдарламаның екі жағдайы бар: "негізгі" және "ішкі түсініктеме". Жағдайы. Кезекті жаңа іс-әрекет

жағдайдың ішкі символынегізі { ішкі жағында жоқнегізі x <> '{' негізі x басуішінде } негізі аралықты басуішінде x <> '}' ішінде жоқ

Ескерту. Бұл бағдарлама салынған түсініктемелерді қабылдамайды: жол{{түсініктемелер ішінде} түсініктемелер} ауысады түсініктемелер} (басында екіаралық тұрады). Соңғы автоматпен түсініктемені өңдеу мүмкін емес (жақшаларсаның білу керек – ал натуралды сан соңғы жадыға сыймайды).

Тапсырма 5Паскаль бағдарламасында тырнақшаға алынған жолдар бар. Егер де кескінді тырнақша жол ішінде кездессе, онда ол түсініктеменің басы

немесе аяқ жағы деген мағынаны білдіреді. Қалай бағдарламаны өзгертеміз, осыныескеру үшін?

Нұсқаулық. Жағдай үш түрлі болады: негізгі, түсініктеме іші, жол іші.

Тапсырма 6Паскальді жүзеге асыру үшін тағыда бір мүмкіндік бар – бұл түрлердің

түсініктемесі 1: ii ; (here i is increased by 1).Сонымен қоса жабылған жақша, ашылған жақшаға сәйкес келе керек ({ ... *)

рұқсат етілмейді). Осындай түсініктемені қалай жоямыз?

Бақылау сұрақтары

1. Құрылымдық синтездің мақсаты неде?2. Құрылымдық синтездің негізгі кезеңдерін атап шық?3. Жадының қандай элементтер түрін білесіндер?

14 -15 зертханалық жұмыс. LL(1)-грамматикасы үшін рекурсивті түсі әдісімен синтаксистік талдау.

Мақсаты: Студентерді бағдарламаны кезеңмен құруға үйрету

3.1 Қысқаша теориялық мәліметтерТерминалданбаған дүкендік танушылар жұмысының модельденуі реттіліктің

бастауыш жай-күйден соңғы жай-күйге ауысуын іздеумен байланысты. Іздеу жеке-жеке қадамдардан тұрады.

Және олардың әрбіреуі сәтсіздікке және бастапқы жай-күйге әкелуі мүмкін.Бұндай іздеу уақытты көпалатындықтан тәжірибеде қайтымсыз жұмыс істейтіндетерминалданған танушыларды қолданады. Бұл танушылар МБ -тілдердің шектеулікластарын ғана қолданысқа жібереді, бірақ олар бағдарламалау тілдерінің барлықсинтаксистік жақтарын көрсетеді.

Танушыларды азаймалы және өрмелі деп екі категорияға бөлуге болады.Азаймалы танушылар ережелерді жоғарыдан төмен өңдейді, яғни жоғары

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

түріндегі грамматикалар тудыратын азаймалы танушылар қарастырылады. LL атауы Left сөзінен шыққан, себебі анализатор кіріс шынжырын солдан –оңға қарай көреді. Тәжірибеде көбінесе 1LL грамматика класы қолданылады.Олар үшін ағымды позицияда орналасқан детерминалданған бір кіріс символдытанушылар жұмыс істейді. Оқудың бірінші қадамы ретінде азаймалы танушылардың

1LL грамматика кластары ішіндегі бір реттілікті қараймыз.

Бөлінген ауыспалылар.Құрамында жою ережелері жоқ мәнмәтінді-бос грамматика төмендегі келесі

екі шартты орындаса ғана бөлінген немесе жай деп аталады: 3 Әр ереженің оң жағы терминалмен басталса.1 Егер екі ереженің сол жағы бірдей болса, онда бұл ережелердің оң жағы

түрлі терминалдық символдармен басталуы керек. Бөлінген грамматиканың негізгі қасиеттерінің бірі – олардың әрқасысына

өрлемейтін детерминалданған танушы құруға болады.

Мысалы, келесі грамматика, сызбамен берілген:

BBBIBIBIRГ ,,,:0.3

бөлек грамматика болып келеді, (1) и (2) жағдайы орындалуда. Басқа жақтан алғанда, грамматика

BBBIBIBIRГ ,,,:1.3

бөлек грамматика болмайды , себебі (2) ережеде шарт бұзылады (1), ал ережесінде(3) және (4) - шарт (2).

Бөлек грамматиканың негізгі қасиеті болып, олардың әрқайсысынандетерминалды төмен түсетін айырылымдарын құруға болады.

Мысалы Ханой мұнараларындағы есепте сақиналардың қозғалу бірізділігін табу үшін

рекурсивті емес бағдарламаны жазвңвз. Шешімі. Рекурсивті бағдарламаны еске түсірейік, i -ді ауыстырып қоятын

жоғарғы сақиналары с m нен n :

procedure move(i,m,n: integer);| var s: integer;begin| if i = 1 then begin| | writeln ('қадам жасау ', m, '->', n);| end else begin| | s:=6-m-n; {s – үшінші өзек: нөмірлер сомасы 6 тең}| | move (i-1, m, s);| | writeln ('қадам жасау ', m, '->', n);| | move (i-1, s, n);| end;end;

Біз көретіндей, " n -ші өзекке m-нің жоғарғы дискін i –ге ауыстыру" nmi ,,

есебі сол үлгідегі үш есепке әкеледі: екі есепке i -1 дисктермен бір есепке жалғыздискпен.Бұл есептермен айналысқанда, тағы не істеу керек екенін ұпытпау керек.

Бұл үшін қалтарылған стек есептерін жасайық.Олардың элементтеріүштіліктер болып келеді.Әр үштілік тапсырыс ретінде интерпретациаланады"жоғарғы i дисктерін m -ші өзектен n -ге ауыстырылсын" qpjnmi ,,,, .Тапсырыстар олардың орындалу талаптарына сәйкес жасалған: ең жедел – стекбиіктігі.Мынадай бағдарлама аламыз:

procedure move(i,m,n: integer);begin| стек тапсырыстарын бос істеу| стекқа үштілікті қою | {инвариант: стектағы тапсырыстарды орындау қалды}| while стек непуст do begin| | жоғарғы элементті жою,оны | | if j = 1 then begin ауыстыру| | | writeln ('қадам жасау', p, '-><j-1,s,q>', q);| | end else begin| | | s:=6-p-q;| | | {s – үшінші өзек: номерлер сомасы 6 тең}

| | | стекқа үштерді қою , <1,p,q><j-1,p,s>, | | end;| end;end;

(ең бірінші стекке үш қойылады, оны соңғы кезде орындау керек). Стек үштіліктері жеке стектері ретінде іске асады. (Сонымен қоса, паскальдің

арнайы түрі бар, оны "жазылу" деп атайды). Тапсырма 1 (А.К.Звонкин Анджея Лисовскиге хабарлады). Ханой мұнаралары туралы

есептерде рекурсивті емес алгоритмдер бар. Олардың бірі: қондыру өзектері ( ауыстырулардан емес) барлық өзектер кезек

бойынша болу керек . Келесі ереже: кезекпен ең аз сақиналарды және ең аз емессақиналарды ауыстыру,сонымен ең азын шеңбер бойнша.

Тапсырма 2 Рекурсия орнына стекті қолдану. Толық санның ондық басылымның

рекурсивті бағдарламасында тапсырмалар кейінге қалдырылған.

Тапсырма 3Екілік бұтақ төбелерінің барлығын жазатын рекурсивті емес бағдарламаны

жазыңыз.

Тапсырма 4Не өзгереді, егерде бұтақтын екілік төбелерін жазбасақ, бірақта оның саның

есептесек? Тапсырма 5 6 мүмкіндігі бар тәртіптер үшін кей жеңілдіктер болуы мүмкін, екі түрдегі

стек элементтерінде керек емес сақталымдарды жасайды. Кейбіреулерін көрсетейік. Ескерту. Бұтақтын барлық төбелерін жазудағы басқа бағдарламасын бұтақты

айналу бағдарламасы негізінде құруға болады (тиісті тарауда қарастырылған) Онда"төмен" ji, командасы орындалады. Енді барлық төбелер тізімін түбірденағымдағы төбеге бару жолын сақтау керек Сонымен қоса графтағы алгоритмдартуралы тараудан қараңыз.

Тапсырма 61 naa ,...,1 – толық сандар болсын. 1b жиымын құрастыру керек, ..., nb ,

ол үшін nbb ...1 сондай сандар болу керек. Ескерту. сандар арасында naa ,...,1 тең болуы мүмкін. Әр толық сан

nbb ...1 қанша рет кірсе, naa ,...,1 да кіру керек. Шешімі. Санауға онай, naa ,...,1 мен nbb ...1 сандары x жиымының

бастапқы және соңғы мағынасын білдіреді. Талаптар " a және b бір сандарды талап

етеді" көре тұра орындалады, егерде x элементтерінің орынын ауыстырупроцесімен шектелсек.

k := 0;{ x жиымының k аз элементтері өз орындарында орналасқан}while k <> n do begin| s := k + 1; t := k + 1;| {x[s] - арасында ең азы... x[k+1] x[t] }| while t<>n do begin| | t := t + 1;| | if x[t] < x[s] then begin| | | s := t;| | end;| end;| {x[s] – ең аз x[k+1]..x[n] }| ... ауыстыру x[s] и x[k+1];| k := k + 1;end;

2 Инвариантты қолданатын, сұрыптау есебіне басқа шешім беру керек.{первые k элементтін біріншісі реттелген: kxx ...1 }

Бақылау сұрақтары

1 Рекурсивті емес бағдарламаны қалай құру керек?2 Не өзгереді, егер де екілік бұтақтын төбесін баспаса, ал тек қана оныңсаның санаса?

Әдебиеттер тізіміНегізгі әдебиеттер

1. Ахо А., Ульман Д. Теория синтаксического анализа, перевода и компиляции. М.: Мир, 1990

2. Грис Д. Наука программирования. М.:Мир. 19843. Дейкстра Э. Дисциплина программирования. М.: Мир, 19784. Касьянов В.Н. Лекции по теории формальных языков, автоматов и сложности

вычислений. – Новосибирск: НГУ, 1995.5. Лавров С. Программирование. Математические основы, средства, теории.

Санкт-Петербург. БХВ-Петербург, 2001.6. Лисков Б., Дж.Гатэг. Использование абстракций и спецификаций при

разработке программ.7. Льюс Ф. Д.Розенкранц. Р.Стирнз. Теоретические основы проектирования

компиляторов. М.: Мир, 19848. Мальцев А.И. Алгоритмы и рекурсивные функции. – М.: Наука, 19869. Языки и автоматы. Сб.переводов. М.:Мир, 1979.

Қосымша әдебиеттер10.Агафонов В.Н. Синтаксический анализ языков программирования.

Уч.пособие, Новосибирск, НГУ, 1981. 91с.11.Ахо А., Дж.Хопкрофт, Дж.Ульман. Построение и анализ вычислительных

алгоритмов – М: Мир, 1979.12.Братчиков И.Л. Синтаксис языков программирования. М.: Наука, 1975. 232с.13.Гинзбург С. Математическая теория контексно-свободных языков. М.: Мир,,

1970. 326с.14.Гладкий А.В. Формальные грамматики и языки. М.: Наука, 1973. 368с.15.Грис Д. Конструирование компиляторов для цифровых вычислительных

машин. М.: Мир, 1975. 544с.16.Кнут Д. Искусство программирования для ЭВМ. В 3 томах. –м.: Мир, 197617.Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы. Построение и анализ –

М:МЦНМО, 1999.