Uelewa wa kisasa wa kujirudia: ufafanuzi wa utendakazi na ufikiaji wake kutoka nje na kutoka kwa utendakazi huu. Inaaminika kuwa kujirudia kulizaliwa na wanahisabati: hesabu ya ukweli, mfululizo usio na mwisho, fractals, sehemu zilizoendelea … Hata hivyo, kurudi tena kunaweza kupatikana kila mahali. Sheria zinazolengwa za asili "huzingatia" kujirudia kama kanuni zao kuu na namna ya kujieleza (kuwepo) si vitu vingi vya ulimwengu wa nyenzo, lakini kwa ujumla kanuni kuu ya harakati.
Watu wa taaluma mbalimbali katika nyanja mbalimbali za sayansi na teknolojia hutumia kanuni ya kujirudia f (x), ambapo "x ~/=f (x)". Kitendo kinachojiita yenyewe ni suluhu thabiti, lakini kuunda na kuelewa suluhisho hili, mara nyingi, ni kazi ngumu sana.
Hapo zamani za kale, urejeshaji ulitumiwa kuongeza nafasi ya ikulu. Kupitia mfumo wa vioo unaoelekezwa kwa kila mmoja, unaweza kuunda athari za anga za pande tatu. Lakini ni rahisi kuelewa jinsi ganikurekebisha vioo hivi? Ni vigumu zaidi kubainisha mahali ambapo nukta katika nafasi iko, inayoakisiwa kupitia vioo kadhaa.
Urejeshaji, kanuni za kujirudia: maana na sintaksia
Tatizo, ambalo hutengenezwa kwa kurudia msururu wa shughuli, linaweza kutatuliwa kwa kujirudia. Kanuni rahisi (kuweka mlinganyo wa quadratic, hati ya kujaza ukurasa wa wavuti na habari, kusoma faili, kutuma ujumbe…) haihitaji kujirudia.
Tofauti kuu za kanuni zinazoruhusu suluhu ya kujirudia:
- kuna algoriti ambayo inahitaji kutekelezwa mara kadhaa;
- algorithm inahitaji data inayobadilika kila wakati;
- algorithm sio lazima ibadilike kila wakati;
- kuna hali ya mwisho: kanuni inajirudia - sio isiyo na kikomo.
Kwa ujumla, haiwezi kubishaniwa kuwa utekelezaji wa mara moja ni sharti la lazima kwa kukosekana kwa sababu ya kujirudia. Pia huwezi kuhitaji sharti la lazima la mwisho: marudio yasiyo na kikomo yana wigo wao wenyewe.
Algoriti inajirudia: wakati mfuatano wa shughuli unafanywa mara kwa mara, kwenye data inayobadilika kila wakati na kutoa matokeo mapya kila wakati.
Mfumo wa kurudia
Uelewa wa hisabati wa kujirudia na analogi yake katika upangaji ni tofauti. Hisabati, ingawa kuna dalili za upangaji programu, lakini upangaji programu ni hisabati ya hali ya juu zaidi.
Algorithm iliyoandikwa vizuri ni kama kioo cha akili ya mwandishi wake. Mkuufomula ya kujirudia katika upangaji ni "f(x)", ambapo "x ~/=f(x)" ina angalau tafsiri mbili. Hapa "~" ni mfanano au kutokuwepo kwa matokeo, na "=" ni kuwepo kwa matokeo ya chaguo la kukokotoa.
Chaguo la kwanza: mienendo ya data.
- function "f(x)" ina algoriti inayojirudia na isiyobadilika;
- "x" na matokeo "f(x)" yana thamani mpya kila wakati, matokeo "f(x)" ni kigezo kipya cha "x" cha chaguo hili la kukokotoa.
Chaguo la pili: mienendo ya msimbo.
- function "f(x)" ina algoriti kadhaa zinazoboresha (kuchanganua) data;
- uchambuzi wa data - sehemu moja ya msimbo na utekelezaji wa algoriti zinazojirudia zinazotekeleza kitendo unachotaka - sehemu ya pili ya msimbo;
- matokeo ya chaguo za kukokotoa "f(x)" sio.
Hakuna matokeo ni ya kawaida. Kupanga programu sio hisabati, hapa sio lazima matokeo yawepo kwa uwazi. Kitendaji cha kujirudi kinaweza kuchanganua tovuti na kujaza hifadhidata, au kusasisha vitu kulingana na ingizo linaloingia.
Data na marudio
Kupanga algoriti zinazojirudia si juu ya kukokotoa kipengele, ambapo chaguo za kukokotoa hupokea kila wakati thamani fulani ambayo ni moja zaidi au chini ya moja - chaguo la utekelezaji linategemea mapendeleo ya msanidi programu.
Haijalishi jinsi "8!",kanuni inayofuata kanuni hii kikamilifu.
Kuchakata taarifa ni "hisabati" ya mpangilio tofauti kabisa. Vitendaji ujirudishi na algoriti hapa hufanya kazi kwenye herufi, maneno, vishazi, sentensi na aya. Kila ngazi inayofuata hutumia iliyotangulia.
Mtiririko wa data ya ingizo huchanganuliwa katika anuwai ya masharti, lakini mchakato wa uchanganuzi kwa ujumla unajirudia. Haijalishi kuandika algoriti za kipekee kwa anuwai zote za mtiririko wa ingizo. Kunapaswa kuwa na utendaji mmoja. Hapa, algoriti zinazojirudia ni mifano ya jinsi ya kuunda mtiririko wa pato ambao unatosheleza ingizo. Hili sio matokeo ya kanuni ya kujirudia, bali ni suluhu linalohitajika na la lazima.
Kufupisha, kujirudia na OOP
Programu zinazolengwa na kitu (OOP) na urejeshaji ni huluki tofauti kimsingi, lakini zinakamilishana kikamilifu. Uondoaji hauhusiani na kujirudia, lakini kupitia lenzi ya OOP huleta uwezekano wa kutekeleza urejeshaji wa muktadha.
Kwa mfano, maelezo yanachanganuliwa na herufi, maneno, vifungu vya sentensi na aya vinaangaziwa kando. Bila shaka, msanidi atatoa uundaji wa matukio ya vipengee vya aina hizi tano na kutoa suluhisho la algoriti zinazojirudia katika kila ngazi.
Wakati huo huo, ikiwa katika kiwango cha herufi "hakuna maana katika kutafuta maana", basi semantiki inaonekana katika kiwango cha maneno. Unaweza kugawanya maneno katika vitenzi, nomino, vielezi, viambishi… Unaweza kwenda mbele zaidi na kufafanua visa.
Katika kiwango cha maneno, semantiki huongezewa na alama za uakifishaji na mantiki.mchanganyiko wa maneno. Katika kiwango cha sentensi, kiwango kamili zaidi cha semantiki hupatikana, na aya inaweza kuchukuliwa kuwa wazo kamili.
Ukuzaji unaolengwa na kitu huamua mapema urithi wa mali na mbinu na kupendekeza kuanzisha safu ya vitu kwa kuundwa kwa babu dhahania kabisa. Wakati huo huo, bila shaka, uchambuzi wa kila kizazi utakuwa wa kujirudia na hautatofautiana sana katika ngazi ya kiufundi katika nafasi nyingi (barua, maneno, misemo na sentensi). Aya, kama mawazo kamili, yanaweza kutokeza kutoka kwa orodha hii, lakini sio kiini.
Ni muhimu kwamba sehemu kubwa ya algoriti inaweza kutengenezwa katika kiwango cha awali cha asili, ikiboresha katika kiwango cha kila kizazi kwa data na mbinu zinazoitwa kutoka kwa kiwango cha dhahania. Katika muktadha huu, ufupisho hufungua upeo mpya wa kujirudia.
Sifa za kihistoria za OOP
OOP imekuja katika ulimwengu wa programu mara mbili, ingawa baadhi ya wataalam wanaweza kutaja kuibuka kwa kompyuta ya wingu na mawazo ya kisasa kuhusu vitu na madarasa kama mzunguko mpya katika ukuzaji wa teknolojia ya IT.
Maneno "kitu" na "lengo" katika muktadha wa kisasa wa OOP kwa kawaida huhusishwa na miaka ya 50 na 60 ya karne iliyopita, lakini yanahusishwa na 1965 na kuibuka kwa Simula, Lisp, Algol, Smalltalk..
Katika siku hizo, upangaji programu haukuendelezwa haswa na haukuweza kujibu ipasavyo dhana za kimapinduzi. Mapambano ya mawazo na mitindo ya utayarishaji (C/C ++ na Pascal - hasa) yalikuwa bado mbali, na hifadhidata bado ziliundwa kimawazo.
Mwishoni mwa miaka ya 80 na mwanzoni mwa miaka ya 90, vitu vilionekana katika Pascal na kila mtu alikumbuka madarasa katika C/C ++ - hii iliashiria mzunguko mpya wa kupendezwa na OOP na wakati huo zana, kimsingi lugha za programu, hazikuwa. saidia tu mawazo yenye mwelekeo wa kitu, lakini badilika ipasavyo.
Bila shaka, ikiwa algoriti za awali za kujirudia zilikuwa tu vitendaji vilivyotumiwa katika msimbo wa jumla wa programu, sasa urejeshaji unaweza kuwa sehemu ya sifa za kitu (darasa), ambacho kilitoa fursa za kuvutia katika muktadha wa urithi.
Kipengele cha OOP ya kisasa
Uundaji wa OOP ulitangaza awali vitu (madaraja) kama mikusanyo ya data na sifa (mbinu). Kwa kweli, ilikuwa kuhusu data ambayo ina syntax na maana. Lakini haikuwezekana kuwasilisha OOP kama zana ya kudhibiti vitu halisi.
OOP imekuwa zana ya kudhibiti vitu vya "asili ya kompyuta". Hati, kitufe, kipengee cha menyu, upau wa menyu, lebo kwenye dirisha la kivinjari ni kitu. Lakini si mashine, bidhaa ya chakula, neno, au sentensi. Vipengee halisi vimesalia nje ya upangaji unaolenga kitu, na zana za kompyuta zimechukua mwili mpya.
Kwa sababu ya tofauti katika lugha maarufu za programu, lahaja nyingi za OOP zimeibuka. Kwa upande wa semantiki, ni sawa kivitendo, na kuzingatia kwao kwenye nyanja ya ala, na sio kwa ile iliyotumika, inafanya uwezekano wa kuchukua maelezo ya vitu halisi zaidi.algorithms na uhakikishe "uwepo" wao wa mfumo mtambuka na lugha mtambuka.
Randi na mbinu za simu za utendaji
Taratibu za utendakazi wa kupiga simu (taratibu, algoriti) zinahitaji kupitisha data (vigezo), kurejesha tokeo, na kukumbuka anwani ya opereta ambayo lazima ipokee udhibiti baada ya utendakazi (utaratibu) kukamilika.
Kwa kawaida, rafu hutumika kwa madhumuni haya, ingawa lugha za programu au msanidi mwenyewe anaweza kutoa chaguo mbalimbali za kuhamisha udhibiti. Programu ya kisasa inakubali kwamba jina la kazi inaweza kuwa si parameter tu: inaweza kuundwa wakati wa utekelezaji wa algorithm. Algoriti inaweza pia kuundwa wakati wa kutekeleza algoriti nyingine.
Dhana ya algorithms ya kujirudia, wakati majina na miili yao inaweza kuamuliwa wakati wa kuunda kazi (kuchagua algoriti inayotakiwa), huongeza kujirudia sio tu kwa jinsi ya kufanya kitu, lakini pia ni nani haswa anayepaswa kufanya. fanya. Kuchagua algoriti kwa jina "la maana" ni jambo la kuahidi, lakini huleta matatizo.
Kujirudia kwenye seti ya vitendakazi
Huwezi kusema kwamba algoriti inajirudia inapojiita na ndivyo hivyo. Kupanga si itikadi ya sharti, na dhana ya kujirudia si hitaji la kipekee la kujiita kutoka kwa mfumo wako wa kanuni.
Matumizi ya kiutendaji hayatoi suluhu safi kila wakati. Mara nyingi, data ya awali lazima iandaliwe, na matokeo ya simu ya kujirudia lazima ichanganuliwe katika muktadha wa shida nzima (algorithm nzima) katika.kwa ujumla.
Kwa kweli, sio tu kabla ya utendakazi wa kujirudi kuitwa, lakini pia baada ya kukamilika, programu nyingine inaweza au inapaswa kuitwa. Ikiwa hakuna matatizo maalum na wito: kazi ya kujirudia A () inaita kazi B (), ambayo hufanya kitu na inaita A (), basi mara moja kuna tatizo na kurudi kwa udhibiti. Baada ya kukamilisha simu ya kujirudia, chaguo la kukokotoa A() lazima lipokee udhibiti ili kupiga tena B(), ambayo itaiita tena. Kurejesha udhibiti jinsi inavyopaswa kuwa kwenye mpangilio kurudi kwenye B() ndio suluhisho lisilo sahihi.
Kitengeneza programu hakina kikomo katika uchaguzi wa vigezo na kinaweza kuvikamilisha kwa majina ya chaguo za kukokotoa. Kwa maneno mengine, suluhisho bora ni kupitisha jina la B() kwa A() na acha A() yenyewe iite B(). Katika kesi hii, hakutakuwa na matatizo na udhibiti wa kurejesha, na utekelezaji wa algoriti ya kujirudia utakuwa wazi zaidi.
Uelewa na kiwango cha kujirudia
Tatizo la kuunda kanuni za kujirudia ni kwamba unahitaji kuelewa mienendo ya mchakato. Unapotumia urejeshaji katika mbinu za kitu, hasa katika kiwango cha babu dhahania, kuna tatizo la kuelewa algoriti yako mwenyewe katika muktadha wa muda wa utekelezaji wake.
Kwa sasa, hakuna vizuizi kwenye kiwango cha utendakazi na uwezo wa kuweka rundo katika mifumo ya simu, lakini kuna tatizo la kuelewa: ni wakati gani wa kiwango cha data au mahali katika algoriti ya jumla inayoitwa kujirudia. kazi na yuko kwa nambari ngapi za simu mwenyewe.
Zana zilizopo za utatuzi mara nyingi hazina nguvumwambie kitengeneza programu suluhu sahihi.
Mizunguko na marudio
Inazingatiwa kuwa utekelezaji wa mzunguko ni sawa na kujirudia. Hakika, katika hali zingine, algoriti inayojirudia inaweza kutekelezwa katika sintaksia ya miundo ya masharti na mzunguko.
Hata hivyo, ikiwa kuna ufahamu wazi kwamba kipengele fulani cha kukokotoa lazima kitekelezwe kupitia algoriti inayojirudia, matumizi yoyote ya nje ya kitanzi au taarifa za masharti yanapaswa kuachwa.
Maana hapa ni kwamba suluhu la kujirudia katika umbo la chaguo za kukokotoa likitumia lenyewe litakuwa algoriti kamili, inayofanya kazi kikamilifu. Algorithm hii itahitaji mpanga programu kuunda kwa bidii, kuelewa mienendo ya algoriti, lakini itakuwa suluhisho la mwisho ambalo halihitaji udhibiti wa nje.
Mchanganyiko wowote wa waendeshaji wa masharti ya nje na mzunguko hautaturuhusu kuwakilisha algoriti inayojirudia kama chaguo kamili la kukokotoa.
Makubaliano ya Kujirudia na OOP
Takriban vibadala vyote vya kutengeneza algoriti inayojirudia, mpango hutokea ili kuunda algoriti mbili. Algorithm ya kwanza hutoa orodha ya vitu vya siku zijazo (tukio), na algoriti ya pili kwa kweli ni kazi ya kujirudi.
Suluhisho bora litakuwa kupanga kujirudia kama mali moja (mbinu) ambayo kwa hakika ina algoriti inayojirudia, na kuweka kazi yote ya maandalizi kwenye kijenzi cha kitu.
Algoriti inayojirudia itakuwa suluhu sahihi tu itakapofanya kazipeke yake, bila udhibiti na usimamizi wa nje. Algorithm ya nje inaweza tu kutoa ishara kufanya kazi. Matokeo ya kazi hii yanapaswa kuwa suluhisho linalotarajiwa, bila usaidizi wa nje.
Recursion lazima iwe suluhisho kamili la kujitegemea kila wakati.
Uelewa angavu na ukamilifu wa utendaji
Wakati upangaji programu unaolengwa na kitu ulipokuwa kiwango halisi, ilionekana dhahiri kuwa ili kuweka msimbo kwa ufanisi, unahitaji kubadilisha mawazo yako mwenyewe. Kipanga programu lazima ahamishe kutoka kwa sintaksia na semantiki ya lugha hadi mienendo ya semantiki wakati wa utekelezaji wa algoriti.
Tabia ya kujirudia: inaweza kutumika kwa kila kitu:
- kukwangua mtandao;
- operesheni za utafutaji;
- kuchanganua maelezo ya maandishi;
- kusoma au kuunda hati za MS Word;
- kuchukua sampuli au kuchambua lebo…
Tabia ya OOP: hufanya iwezekane kuelezea algoriti inayojirudia katika kiwango cha asili dhahania, lakini iruhusu kurejelea vizazi vya kipekee, ambavyo kila kimoja kina ubao wake wa data na sifa.
Recursion ni bora kwa sababu inahitaji utendakazi kamili wa algoriti yake. OOP huboresha utendakazi wa algoriti inayojirudia kwa kuipa ufikiaji wa watoto wote wa kipekee.