2.1 Мысал
Бұл мысал X = A + B өрнегінің ауыстырылуын көрсетеді. Мұндағы,
X, A, және B - бүтін айнымалылар. Бұл айнымалылар жады ұяшығында
көрінеді деп есептеледі.
56
Пайыз белгісі "%" шолуды бастайды. Үш адреслы машинадағы нұсқау-
лық келесі түрде болады:
integer_add A, B, X % Add data loaded from memory locations A
% and B, and store back in X.
Екі адреслы машиналар үш адреске ие юлда алмағандықтан, 3 адреслы
машиналардың нұсқаулықтары 2-адреслы нұсқаулықтың командалары-
ның ретіне бөлінген. Екінші аргумент те белгілеу пункті ретінде пай-
даланылады. 2-адреслы машинадағы төменгі деңгейдің сәйкес нұсқау-
лығы келесі түрде болады:
load A, R0 % load the content of memory location A into the
% register R0
integer_add B, R0 % add the contents of the memory location B
% and the register R0
store R0, X % store the content of R0 into the memory location X
Бір адресті машиналар аккумуляторды кіріс аргументтері мен белгілеу
пунктінің бірі ретінде айқын емес пайдаланады. Төменгі деңгейлі бір
адресті нұсқаулықтардың сәйкес жиынтығы келесі түрде болады:
load A % load the content of memory location A into the
% accumulator
integer_add B % add the contents of the memory location B with
% the content of the accumulator
store X % store the content of accumulator in the memory
% location X
Нөлдік адресті машина (Java виртуалды машинасының командалар
жинағында көрсетілгендей) А және В жады ұяшықтарын құрылған
стекқа жүктейді, стектың екі мәнін қосады және сумманы стек басына
қалдырып, содан кейін стектың жоғарғы бөлігіндегі Х жады ұяшығы-
на сақтайды. Жүктеу операциясы дегеніміз екі операцияның ретінен
тұрады: әуелі ол жады ұяшығының адресін "load_literal» нұсқаулығы
арқылы стектың басына жүктеп, содан кейін жады ұяшығының мәнін
жүктеу командасының көмегімен жүктейді.
load_literal 3 % Push the address of X on top of the
% evaluation stack.
load_literal 1 % Push the address of A on top of the
57
% evaluation stack.
load % Pop the address of A and push the content of A on top
% of the evaluation stack.
load_literal 2 % Push the address of B on top of the evaluation
% stack.
load % Pop the address of B and push the content of B on top
% of the evaluation stack.
integer_add % Pop top two elements from the stack, add them,
% and push the result on the stack.
store % Pop the result, pop the address X, and store result
% into the memory location X.
2.1 мысалда көрсетілгендей дәл сол тапсырманы орындау үшін төмен-
гі адрес нұсқаулығын қажетті көбірек нұсқаулық орнату керек. Өйткені
әрбір команда жады таңдауды білдіреді. Төменгі адресті машиналарға
жоғарғы адреслы машиналарда таңдау жасаған кезде көбірек жады ке-
рек болады. Осылайша, нөлдік адресті виртуалды машиналар жоғары
адресті машиналардағы бастапқы құрастырылған кодқа қарағанда ба-
яуырақ жұмыс істейді.
2.2 Үзілісті құрылымдардың тұжырымдамасы
Бұл бөлімде біз мәліметтердің абстрактылы көріністеріне қатысы бар
дискретті құрылымдардың таңдап алынған тұжырымдамаларын жаңар-
тамыз. Олардың өзектілігі келесі тарауларда бағдарламалау тілдерінің
тұжырымдамаларын талқылауды жалғастырған кезде анық болады.
2.2.1 Жиындармен операциялар
Бағдарламалау тілдеріндегі жиын және жиындармен операциялар түсіні-
гі әртүрлі деңгейде қолданылады. Жиын (1) 7-тарауда айтылғандай тип-
тер теориясындағы типтерді анықтау үшін; (2) Паскаль, Сетл (SETL),
Модула, Клэр, Руби және Питон сияқты тілдердегі жиын бағдарламалау
үшін; және (3) Java, C ++ және Пролог сияқты көптеген кең тараған тіл-
дерде жиын бағдарламалау үшін кітапханаларда қолданылады.
Жиын дегенміз мәліметтердің бірегей элементтерінің жиынтығы.
Жиындағы элементтердің орнын ауыстырғанмен жиынның өзі өзгер-
мейді. Мультижиын – мәліметтердің мағынасы бір бірнеше элемент-
тері бар нысандар жиынтығы. Мысалы, { 1, 2, 3, 2, 4, 5, 7} 2 элементі
үш рет қайталанатын мультижиын. Соған қарамастан, мультижиындағы
элементтердің орнын ауыстырғанмен, мультижиын өзгеріссіз қалды.
Мультижиынның қызықты ішкі классы бар. Ол – реттелген мульт-
58
жиын. Реттелген мультижиынның әрбір элементі сәйкес позицияға
байланысты. { Миира, Джон, Ли} реттелген мультжиында Миира 1-по-
зициямен байланысты, Джон 2-позициямен байланысты, ал Ли 3-пози-
циямен байланысты. Реттелген мультжиында элементтердің орнын ауы-
стырған кезде мультижиынның реті өзгереді. Өйткені сәйкес позициясы
да өзгереді. Мысалы, { Меера, Джон, Ли} реттелген мультжиынындағы
{ Джон, Меера, Ли} мультжиынының дәл өзі емес. Өйткені, Меера
бірінші реттелген мультжиында 1-позициямен, ал екінші мультжиын-
да 2-позициямен байланысып тұр. Реттелген мультжиын бағдарламалау
тілдерінің көптеген құрылымдарында үлкен рөл атқарады. Тізбектер,
қатарлар, файлдар және басқа да құрылымдар 7-тарауда айтылғандай
реттелген мультижиын сияқты моделденеді.
Ол ішкі жиындармен, жиындардың бірігуімен және қиылысуымен жақ-
сы қарым-қатынаста. Осы жиынның барлық мүмкін болатын ішкі жиын-
дарындағы жиындар берілген жиынның көрсеткіш жиыны деп атала-
ды. Мысалы, { X, Y, Z} жиынының көрсеткіш жиыны былай беріледі {{}
(бос жиын), { X}, { Y}, { Z}, { X, Y}, { Y, Z}, { X, Z}, or { X, Y, Z}}. Ішкі жиын
алу үшін элемент не таңдап алынуы мүмкін, не барлық мүмкіндіктерді
беріп еленбей қалуы мүмкін. Осылайша, берілген жиынның көрсеткіш
жиынтығы 2 N, мұндағы N соңғы жиынтағы элементтер саны.
2.2.1.1 Декарттың шығармасы
Декарттық көбейтінді дегеніміз ол екі немесе одан да көп жиын және
жаңа N-қосалқы жиын алатын жиын. Мұндағы, N – декарттық көбей-
тіндідегі жиын саны. A1 × A2 ×, …, ×A N ( N ≥ 2) декарттық көбейтін-
діні есепке ала отырып, N-қосалқы жиынның бірінші қатары A1 және
Ith жиынының элементі болады, ( I ≤ N) N-қосалқы жиын Ith элементі
болады. Алынған жиындағы элементтер саны былай беріледі: |A1| × |A2|
× |A3| × |A4| … |A I| × … × |A N| , мұндағы |Ai| Ith жиындағы элементтер
саны.
2.2 Мысал
Үш жиынды қарастырайық: A = { a, b, c}, B = { x, y, z}, және C = { 1, 2, 3}.
A × B × C декарттық көбейтіндінің 3 × 3 × 3 = 27 үш мүмкіндігі бар: {( a,
x, 1), ( a, x, 2), …, ( c, z, 1), ( c, z, 2), ( c, z, 3)}.
2.2.1.2 Бейнелеу
Бейнелеу дегеніміз жиынның бір жиынтығының элементтерін басқа эле-
менттермен байланыстыру, "one-to-one", немесе "many-to-one" байланы-
стары арқылы байланыстыру. 2.2 суретте D домендері мен R мәндерінің
59
облыстарының сәйкестігі келтірілген. D жиынында бес элемент және R
жиынында алты элемент бар. Егер біз бейнелеуге «.D-дағы элементтер
квадраты» деп анықтама берсек, онда D доменнің әрбір элементі R эле-
ментінде бейнеленеді. D облысындағы біреуден артық элемент R-дегі
тура сол элементті бейнелейді. Алайда, D облысындағы бір элемент R
мәні облысында бір элементтен артық бейнелей алмайды.
2.2.1.3 Изоморфизм
S1 мен S2 :арасында бейнелеу болатындай F және G биективті функци-
ялар жұбы болса, онда S1 және S2 екі жиыны изоморфты. F функциясы
S1 және S2 элементтерін "one-to-one" байланыс арқылы, G функциясы
S2 және S1 элементтерін "one-to-one" байланысы арқылы бейнелейді.
Ал G функциясы "F" функциясының кері функциясы болып табылады.
2.3 Мысал
Мысалы, S1 = {1, 2, 3} и S2 = {4, 5, 6} екі жиынын алайық. S1 жиыны-
ның барлық элементтерін "one-to-one" байланысы арқылы S1 облысына
3 элемент қосу арқылы S2 жиынының барлық элементтерін бейнелей-
тін add_3 функциясы бар.
Domain D - Домен D; Codomain R – Кодомен R.
2.2-сурет. Квадраттық функцияның көмегімен бейнелеу.
Мұның сәйкес кері функциясы subtract_3, ол S2 әрбір элементін S1
жиынының элементінде бір-бірлеп алу әдісінің негізінде бейнелейді.
Екі функция да add_3 және subtract_3 - бір-біріне кері функциялар.
2.2.1.4 Функциялар
F функциясы D облысындағы кез-келген х ∈ элементтің С облысын-
дағы F(х) ∈ бейнесінде бейнеленуі. F(х ∈ D) ⊆ C бейнесінің жиыны
60
функция диапазоны деп аталады. Тең функция элементті өзі бейнелесе,
тұрақты функция жиынның әрбір элементін тіркелген бірегей элемент-
ке бейнелейді. Функция "one-to-one" немесе инъективті деп аталады.
Егер домендегі барлық элементтер үшін мәні облысында айтарлықтай
бейне болса, яғни егер у1 = F (x1∈ D) и y2= F(x2∈ D), және x1 ≠ x2 и y1,
y2 ∈ C онда y1 ≠ y2. Егер у ∈ C кез келген элементі үшін f(х) = у функ-
циясы үшін х ∈ D элементі болса онда бұл функция бейнелеу немесе
сюръективті функция деп аталады. Егер функция бейнелеу және "one-
to-one" болса, онда ол биективті функция деп аталады. Бұл дегеніміз,
мән облысындағы элемент үшін доменде элементтің бірегей бейнесі
бар. F биективті функциясын ескере отырып,
F-1 кері функциясы мән облысында облыстағы F-1 (F (х ∈ D)) = х болып
табылатын элементке сәйкес келетін бірегей бейнені бейнелейтін функ-
ция ретінде анықталуы мүмкін.
Бағдарламалауда сюръективті функциялар өте маңызды. Өйткені
анықталған функцияның болмауы қате шартқа пара-пар. Сюръективті
емес функция диапазонда ⊥ белгісімен белгіленген нөлдік таңбасы
енгізу арқылы сюръективті болады. Нөлдік таңбасы мән облысында
кез келген нөлдік емес таңбасымен сәйкес келмейтін облыстағы бар-
лық таңбасыдардың бейнесі болып табылады. Нөлдік таңбасы идеясы
3-тараудағы бағдарламалау тілінің денотациялық семантикасын және
9-тараудағы функционалды бағдарламалауды түсіндіру үшін пайдала-
нылған.
Функцияның бағдарламалық көрінісі үш бөлімнен тұрады: айнымалы,
өрнек және кіріс параметрлер. Егер кіріс мәндер берілсе, онда кіріс
мәндер айнымалымен байланысты болады. Айнымалысы бар өрнекте
алмастыру орын алады. Өрнек ықшамдалғаннан кейін шығыс мәндеп
қайтып келеді. Функцияны бірнеше бағдарламалық модулдегі әртүрлі
орыннан шақыру үшін функцияға ат беру мүмкін.
2.4 Мысал
Мәліметтер құрылымы мен бағдарламалау курсында оқыған белгілі
факториал(n) функциясын қарастырайық. Функцияның берілген пара-
метрге байланған n айнымалысы бар. Функция денесі анықтаманың оң
жақ бөлігінде берілген.
factorial(n) =
if (n == 0) return(1) % base case
else return(n * factorial(n – 1))% recursive
% definition
61
Факториала (n) функциясының денесі екі өрнектен тұрады: “if (n == 0)
then return (1); if (n > 0) return (n * factorial(n – 1)).” Екі өрнек те (if-then-
else) абстракция шартты операторымен байланысқан. Ал (п> 0) тест
дегеніміз шартты оператор негізінде алынады.
Біз факториалды (3) шақырған кезде 3 n айнымалымен байланыста. Со-
дан кейін, ол функция денесінің өн бойында ауысады да, функцияның
өзі "if (3 == 0), then return 1 else return (3 * factorial(3 - 1))." көшіріледі.
Шарт бағаланады, ал функция қосымша return(3 * factorial(3 – 1)) үшін
ықшамдалады. (3 – 1) ықшамдалады, ал функция return(3 * factorial(2))
қосымша ықшамдалады. Қазіргі уақытта function(3) –ті бағалау
factorial(2) есептелмейінше тоқтатылады.
2.2.2 Буль логикасы және предикаттарды есептеу.
Буль логикасы кейбір пайымдаулардың ақиқат мағынасын байланысты-
руға негізделген. Аксиома не «ақиқат» (true) не «жалған» (false) бола-
тын пайымдау немесе болжам болады. Ақиқаттылықтың бұл мәндері
logical-AND ("∧" белгісімен белгіленеді), logical-OR ("∨" белгісімен
белгіленеді), жанама ("→" белгісімен белгіленеді) және терістеу ("¬"
белгісімен белгіленеді) сияқты әртүрлі логикалық операторларды қол-
данумен құрастырылған болуы мүмкін. logical-AND және logical-OR
операторлары А және В екі логикалық аксиоманы біріктіреді. 2.2-кесте-
де көрсетілгендей А және В ақиқат болу үшін A ∧ B ақиқат болу керек
және екеуі де А және В жалған болу үшін A ∨ B жалған болуы керек.
логикалық операцияның қорытындысы A → B егер А ақиқат болса,
онда В да ақиқат дегенді білдіреді. Егер А жалған болса В-ның ақиқат
екенін анықтау мүмкін емес. Осылайша, егер А мәні жалған болса, онда
В ақиқат та, жалған да болады. Терістеу егер А аксиомасы ақиқат болса,
онда А жалған, ал егер А жалған болса, онда А ақиқат дегенді білдіреді.
2.5 мысал
А аксиомасына «адамдар жаңашыл», ал В аксиомасына «адамдар
тәкаппар» дегенді алайық. А аксиомасы және В аксиомасы ақиқат деп
есептейік: онда А ∧ B да ақиқат. Осылайша «Адамдар жаңашыл және
тәкаппар» болып шығады. Егер біз logical-OR операторын қарастырсақ,
және егер А аксиомасы ақиқат, немесе В аксиомасы ақиқат болса немесе
екеуінің біреуі ақиқат болса, онда «Адамдар жаңашыл немесе тәкаппар
болады» аксиомасы ақиқат болады.
Logical-AND және logical-OR операторлары 2.3-кестеде көрсетілгендей
бір-бірімен байланысты. Бұл тұжырым бағдарламалар жасау кезінде
және бағдарламаларды параллель орындау кезінде кеңінен қолданыла-
62
ды. Бір-біріне ұқсас бульдік операциялардың көптеген амалдары бар.
Мысалы, Де Морган теоремасы терістеу операциясы арқылы logical-
AND және logical-OR операцияларына жатады. Де Моргана заңы: (1)
конъюкцияны терістеу дизъюнкцияны терістеу сияқты және (2) дизъ-
юнкцияны терістеу конъюнкцияны терістеу болып табылады
2.2-кесте. Бағдарламалау тілдерінде пайдаланылатын логикалық опера-
торлар үшін ақиқат кестесі.
А
B
¬(A)
A ∧ B
A ∨ B
A → B
Ақиқат Жалған
Жалған
Жалған
Ақиқат
Жалған
Жалған Жалған
Ақиқат
Жалған
Жалған
Ақиқат
Ақиқат Ақиқат
Жалған
Ақиқат
Ақиқат
Ақиқат
Жалған Ақиқат
Ақиқат
Жалған
Ақиқат
Ақиқат
2.2.2.1 Бірінші қатардың предиктін есептеу
Күрделі пікірлерді зерттейтін айтылымдық логика қарапайым пікірлер-
ден логикалық оператордың көмегімен пайда болған. Егер біз айтылым-
дық логиканы квантордың екі типімен – жалпылық кванторы (∀ бел-
гісімен белгіленеді) және болу кванторымен (∃ белгісімен белгіленеді)
толықтырсақ – онда ондай логика «бірінші қатардың логикасы» деп
аталады. Жалпылық кванторы бұл барлық белгіленген элементтер үшін
дұрыс шарт. Әр бір ерекшелікті жиынның әрбір элементімен байланы-
стырғаннан кейін егер нысан ерекшелік байланысқан жиынның бір бөл-
шегі болса, онда нысан да қасиетпен байланысатын болады. Мысалы,
егер «Ер адамдар ұзақ өмір сүргенді қалайды, ал Джон ер адам» десек,
бұл жерден шығаратын жалғыз қорытынды «Джон ұзақ өмір сүруді қа-
лайды» болмақ. Енді бұл пайымдауды бірінші қатардың логикасының
ережесімен (FOPC). сәйкестендіріп көрейік. Бірінші қатардағы логика
ережесі бойынша, ∀x (ер адам(x) → ұзақ өмір сүргенді қалайды(x)).
63
Егер біз осы ережені оқысақ, онда ол жерде барлық "х" үшін, егер "х"
ер адам, онда "х" ұзақ өмір сүргенді қалайды дегенді білдіреді. Джон-ер
адам. Импликация ережесі қолданып, Джон ұзақ өмір сүруді қалайды.
Болу кванторы ерекше қасиеттерін қанағаттандыратын элементті сұрап
тұр. Мысалы, ∀x ∀y ережесі ( бірдеңгейлі элемент( x, y) → ∃z ( parent( x,
z), parent( y, z), not ( x == y) барлық x және барлық y үшін х y-тың
бірдеңгейлі элементі болып табылады, егер осындай z болса, онда z X –
тың аталығы болады, ал Z у-тің аталығы болады, х у-ке тең болмайды
деп пайымдайды. z айнмалысы - х және у екеуі үшін де аталық болып
табылатын жиындағы элемент үшін болу кванторы бо-лып табылады.
2.4-кестеде көрсетілгендей екі кванторға қатысты көптеген балама
қаси-еттер бар. Болу кванторы да, жалпылама коммутативті де.
Алайда, жал-пылама кванторы болу кванторымен араласқан кезде онда
жағдай күр-деленеді. Мысалы, егер ерекшелік жиынның барлық
элементтері үшін дұрыс болса (∀ x P( x), онда бұл бұл қасиет ақиқат
болмайтын (¬∃x ¬P(x)) элемент бар дейтін жағдай емес.
Дәл осылай (∃x Р (х)) ¬ ∀x (¬ Р (х))-ға эквивалентті. Егер біз жалпылама
кванторды болу кванторымен араластырсақ, онда коммутация заңы қол-
данылмайды: ∀x ∃y мен ∃y ∀x эквивалентті емес. «Әрбір X адам үшін,
X жақсы көретін Y адам бар» деген мәлімет (∀x ∃y жақсы көреді (х, у))
«Әрбір X адам жақсы көретін Y адам бар» (∃y ∀x жақсы көреді х, у))
деген мәліметпен бірдей емес.
Бірінші қатардың логикасы 10-тарауда сипатталған логикалық бағдарла-
малау парадигмасы негізінде жатыр. Бірінші қатардың логикасының бір
шектеуі, ол қарым-қатынасқа байланысты қатынасты көрсете алмайды.
Жоғарғы қатарды есептеу қарым-қатынасқа қатысты қатынасты көрсе-
туі мүмкін. Соған қарамастан, бұл тақырыпты талқылау кітаптан тыс.
2.2.2.2 Қатынастар
Функциялар сияқты қатынас та бағдарламалауда және бағдарламалауға
қажетті типтер көрінісінде кеңінен қолданылады. Бұл бөлімде біз қаты-
настың негізгі қасиеттерін қарастырамыз.
64
Бинарлық қатынас R екі жиынның декарттық көбейтіндінің жеке ішкі
жиыны болып табылады: S1 домен мен S2 облысы. Математикалық тіл-
мен айтсақ, R ⊆ S1 × S2 қатынас және әрбір х ∈ S1 элемент у ∈ S2
элементімен R қатынас арқылы байланыста. Бұл реттелген (х, у) ∈ R
жұп үшін. Екі субъект арасындағы байланыс хRу немесе R (х, у) түрінде
көрініс табуы мүмкін.
Қатынас рефлексивті, симметриялы, антисимметриялы немесе тран-
зитивитті болу мүмкін. Егер xRx доменнің әрбір элементі үшін дұрыс
болса R қатынасы рефлексивті. Егер әрбір(х, у) ∈ R реттелген жұп үшін
басқа (у, х) ∈ R реттелген жұп болса, онда R симметриялы. Басқаша ай-
тқанда, хRy yRx-ге эквивалентті. Егер xRy ешқашан х-пен yRx қатынас
арқылы байланыспаған болса, онда қатынас антисимметриялы. Егер
хRу және yRz реттелген (х, z) ∈ R жұп бар десе, онда бұл қатынас тран-
зитивті. Қатынас түсінігі бағдарламалаудың негізгі қасиеттерін дамы-
туда кеңінен қолданылады. R қатынасы егер R рефлексивті, симметри-
ялы және транзитивті болса, онда эквиваленттілік қатынасы болады.
2.6-мысал
Мысалы, «көбірек» қатынасы (немесе «азырақ») антисимметриялы
және транзитивті. Дәл осылай «теңдік» қатынасы рефлексивті, сим-
метриялы жіне транзитті болып келеді. х айнымалының мәні (xRx)-ке
тең; егер х айнымалының мәні у айнымалының мәніне тең болса, онда
у айнымалының мәні х айнымалының мәніне тең (хRу дегеніміз уRх);
егер х айнымалының мәні у айнымалының мәніне тең болса, ал у айны-
малының мәні z айнмалының мәніне тең болса, онда х айнымалының
мәні z айнымалының мәніне тең (х == у және у == z дегеніміз х == z).
Рефлексивтіліктің, симметрияның және Транзитивтіліктің қасиеті сан-
дар қатарын сұрыптау сияқты қарапайым бағдарламалардағы көптеген
операторларда болымсыз қолданылған. Транзитивтілік қасиеті 8-тарау-
да мәліметтер тәуелділігінің графигінде және айнымалылар псевдоним-
дерінің эквиваленттілігін сараптау кезінде қолданылады.
2.2.3 Рекурсия
Рекурсия – функцияның өзінен тікелей немесе басқа функциялар арқылы
функцияны (үдерісті) шақыру. Рекурсия факториал және Фибоначчи си-
яқты рекурсивті функцияларды анықтау үшін немесе байланысқан тізім
немесе ағаш сияқты мәліметтердің рекурсивті құрылымы сияқты рекур-
сивті функцияларды анықтау үшін пайдаланылуы мүмкін.
Рекурситі анықтаманың кем дегенде бір базалық жағдайы және кем де-
генде бір рекурсивті анықтамасы бар. Рекурсивті анықтама біртіндеп
65
жайылып, негізгі нұсқаға(ларға) жақындайды. Жайылудың соңында ре-
курсия негізгі жағдаймен аяқталып, есептеу нәтижесі шақырту жіберген
рекурсивті функцияға кері ретпен кері қайтады. Рекурсивті функциялар-
ды шақырту саны кіріс дабылдардың белгісімен анықталады. Алдыңғы
шақырту келесі жайылумен шақырылған шақырту бағаланғанша тоқтай
тұрады. Шақырылған функцияның тізбегінде есептеу жүргізу үшін қа-
жетті жады ұяшықтарын сақтау үшін стекты үздіксіз пайдалануды қа-
жет ететін тоқтаған үдерісті сақтау керек.
2.7-мысал
factorial(0) = 1. % base case
factorial(n) = n * factorial(n – 1) % recursive definition
Факториал( n) функциясы рекурсивті анықталады n * факториал( n – 1),
ал факториалдың негізгі жағдайы - факториал( 0) = 1. Ф акториал( 4)
функциясын шақыру 4 * факториал(3) сияқты жайылады; факториал( 3)
3 * факториал( 2) сияқты жайылады; факториал( 2) 2 * факториал( 1)
сияқты жайылады; және факториал( 1) как 1 * факториал( 0) сияқты
жайылады; факториал( 0) негізгі жағдай болып табылады. Ф акториал
( 0) бағаланғаннан кейін, 1 мәні факториал ( 1)-ге беріледі; факториал
( 1) факториала ( 2) үшін 1 * 1 = 1-ге өтеді. факториал ( 2) факториала
( 3) үшін 2 * 1 = 2-ге өтеді; факториал ( 3) факториала ( 4) үшін 3 * 2-ге
өтеді. Соңғы мән 4 * 6 = 24 соңында оралады.
2.8 мысал
Рекурсивті функцияның басқа мысалы «Фибоначчи санын» табу болып
табылады. Фибоначчи санын анықтаудың төменде көрсетілгендей екі
базалық жағдайы бар.
Фибоначчи(0) = 1 % base case Фибоначчи(1) = 1 % base case
Фибоначчи(n) = Фибоначчи(n - 1) + Фибоначчи(n - 2) % recursive
% definition
Достарыңызбен бөлісу: |