Ռեկուրսիվ ալգորիթմ՝ նկարագրություն, վերլուծություն, առանձնահատկություններ և օրինակներ

Բովանդակություն:

Ռեկուրսիվ ալգորիթմ՝ նկարագրություն, վերլուծություն, առանձնահատկություններ և օրինակներ
Ռեկուրսիվ ալգորիթմ՝ նկարագրություն, վերլուծություն, առանձնահատկություններ և օրինակներ
Anonim

Ռեկուրսիայի ժամանակակից ըմբռնում. ֆունկցիոնալության սահմանում և մուտք դեպի դրան դրսից և այս գործառույթից: Ենթադրվում է, որ ռեկուրսիան ծնվել է մաթեմատիկոսների կողմից՝ գործոնային հաշվարկ, անսահման շարքեր, ֆրակտալներ, շարունակվող կոտորակներ… Այնուամենայնիվ, ռեկուրսիան կարելի է գտնել ամենուր։ Օբյեկտիվ բնական օրենքները «համարում» են ռեկուրսիան որպես իրենց հիմնական ալգորիթմ և արտահայտման ձև (գոյություն) ոչ այնքան նյութական աշխարհի առարկաների, որքան ընդհանուր առմամբ շարժման հիմնական ալգորիթմը։

ռեկուրսիվ ալգորիթմ
ռեկուրսիվ ալգորիթմ

Գիտության և տեխնիկայի տարբեր ոլորտներում տարբեր մասնագիտությունների տեր մարդիկ օգտագործում են ռեկուրսիվ ալգորիթմը f (x), որտեղ «x ~/=f (x)»: Ինքն իրեն կոչող ֆունկցիան ուժեղ լուծում է, բայց այս լուծումը ձևավորելը և հասկանալը շատ դեպքերում շատ բարդ խնդիր է։

Հին ժամանակներում ռեկուրսիան օգտագործվում էր պալատական տարածքը մեծացնելու համար։ Իրար ուղղված հայելիների համակարգի միջոցով դուք կարող եք ստեղծել ապշեցուցիչ եռաչափ տարածական էֆեկտներ: Բայց մի՞թե այդքան հեշտ է հասկանալ, թե ինչպեսհարմարեցնել այս հայելիները Նույնիսկ ավելի դժվար է որոշել, թե որտեղ է գտնվում տարածության կետը, որն արտացոլվում է մի քանի հայելիների միջոցով:

Ռեկուրսիա, ռեկուրսիվ ալգորիթմներ. իմաստ և շարահյուսություն

Խնդիրը, որը ձևակերպվում է գործողությունների հաջորդականության կրկնությամբ, կարող է լուծվել ռեկուրսիվ: Պարզ ալգորիթմը (քառակուսի հավասարման հաշվարկ, վեբ էջը տեղեկատվությամբ համալրելու սցենար, ֆայլ կարդալու, հաղորդագրություն ուղարկելու համար…) ռեկուրսիա չի պահանջում:

Ալգորիթմի հիմնական տարբերությունները, որոնք թույլ են տալիս ռեկուրսիվ լուծում.

  • կա ալգորիթմ, որը պետք է մի քանի անգամ գործարկվի;
  • ալգորիթմին անհրաժեշտ են տվյալներ, որոնք ամեն անգամ փոխվում են;
  • պարտադիր չէ, որ ալգորիթմը փոխվի ամեն անգամ;
  • կա վերջնական պայման. ալգորիթմը ռեկուրսիվ է, ոչ անսահման:

Ընդհանուր առմամբ, չի կարելի պնդել, որ մեկանգամյա կատարումը անհրաժեշտ պայման է ռեկուրսիայի պատճառի բացակայության համար։ Դուք նույնպես չեք կարող պահանջել պարտադիր վերջնական պայման. անսահման ռեկուրսիաներն ունեն իրենց շրջանակը:

Ալգորիթմը ռեկուրսիվ է. երբ գործողությունների հաջորդականությունը կատարվում է բազմիցս, տվյալների վրա, որոնք ամեն անգամ փոխվում են և ամեն անգամ տալիս են նոր արդյունք:

Ռեկուրսիայի բանաձև

Ռեկուրսիայի և դրա անալոգի մաթեմատիկական պատկերացումները ծրագրավորման մեջ տարբեր են: Մաթեմատիկա, թեև ծրագրավորման նշաններ կան, բայց ծրագրավորումը շատ ավելի բարձր կարգի մաթեմատիկա է։

ռեկուրսիվ ալգորիթմ զ
ռեկուրսիվ ալգորիթմ զ

Լավ գրված ալգորիթմը նման է իր հեղինակի ինտելեկտի հայելուն: ԳեներալԾրագրավորման մեջ ռեկուրսիայի բանաձևը «f(x)» է, որտեղ «x ~/=f(x)»-ն ունի առնվազն երկու մեկնաբանություն: Այստեղ «~»-ը արդյունքի նմանությունն է կամ բացակայությունը, իսկ «= -ը ֆունկցիայի արդյունքի առկայությունն է։

Առաջին տարբերակ. տվյալների դինամիկա:

  • «f(x)» ֆունկցիան ունի ռեկուրսիվ և անփոփոխ ալգորիթմ;
  • "x" և արդյունքը "f(x)" ամեն անգամ ունեն նոր արժեքներ, արդյունքը "f(x)" այս ֆունկցիայի նոր "x" պարամետրն է:

Երկրորդ տարբերակ. կոդի դինամիկա:

  • «f(x)» ֆունկցիան ունի մի քանի ալգորիթմներ, որոնք ճշգրտում են (վերլուծում) տվյալները;
  • տվյալների վերլուծություն - կոդի մի մասը և ռեկուրսիվ ալգորիթմների իրականացում, որոնք կատարում են ցանկալի գործողությունը - կոդի երկրորդ մասը;
  • «f(x)» ֆունկցիայի արդյունքը չէ:

Ոչ մի արդյունք նորմալ չէ։ Ծրագրավորումը մաթեմատիկա չէ, այստեղ արդյունքը պարտադիր չէ, որ բացահայտ լինի: Ռեկուրսիվ ֆունկցիան կարող է պարզապես վերլուծել կայքերը և համալրել տվյալների բազան կամ ակնարկել օբյեկտները՝ ըստ մուտքային մուտքի:

Տվյալներ և ռեկուրսիա

Ռեկուրսիվ ալգորիթմների ծրագրավորումը գործոնային հաշվարկը չէ, երբ ֆունկցիան ամեն անգամ ստանում է տրված արժեք, որը մեկից ավելի կամ պակաս է մեկից ավելի կամ պակաս. իրականացման տարբերակը կախված է մշակողի նախընտրությունից:

Կարևոր չէ, թե ինչպես է ֆակտորալային «8»-ը,ալգորիթմ, որը խստորեն հետևում է այս բանաձևին:

Տեղեկատվության մշակումը բոլորովին այլ կարգի «մաթեմատիկա» է։ Ռեկուրսիվ ֆունկցիաները և ալգորիթմներն այստեղ գործում են տառերի, բառերի, արտահայտությունների, նախադասությունների և պարբերությունների վրա: Յուրաքանչյուր հաջորդ մակարդակ օգտագործում է նախորդը:

Մուտքային տվյալների հոսքը վերլուծվում է պայմանների լայն շրջանակում, սակայն վերլուծության գործընթացը հիմնականում ռեկուրսիվ է: Անիմաստ է գրել եզակի ալգորիթմներ մուտքային հոսքի բոլոր տարբերակների համար: Պետք է լինի մեկ ֆունկցիոնալություն. Այստեղ ռեկուրսիվ ալգորիթմները օրինակներ են, թե ինչպես ձևավորել ելքային հոսք, որը համարժեք է մուտքագրմանը: Սա ռեկուրսիվ ալգորիթմի արդյունքը չէ, այլ ցանկալի և անհրաժեշտ լուծումը։

Աբստրակցիա, ռեկուրսիա և OOP

Օբյեկտ ուղղված ծրագրավորումը (OOP) և ռեկուրսիան սկզբունքորեն տարբեր միավորներ են, բայց դրանք կատարելապես լրացնում են միմյանց: Աբստրակցիան կապ չունի ռեկուրսիայի հետ, բայց OOP-ի ոսպնյակի միջոցով այն ստեղծում է համատեքստային ռեկուրսիայի իրականացման հնարավորություն։

Օրինակ, տեղեկատվությունը վերլուծվում է, և տառերը, բառերը, արտահայտությունները, նախադասությունները և պարբերությունները առանձնացված են առանձին: Ակնհայտ է, որ մշակողը նախատեսում է ստեղծել այս հինգ տիպի օբյեկտների օրինակներ և կառաջարկի ռեկուրսիվ ալգորիթմների լուծում յուրաքանչյուր մակարդակում:

ծրագրավորման ռեկուրսիվ ալգորիթմներ
ծրագրավորման ռեկուրսիվ ալգորիթմներ

Մինչդեռ, եթե տառերի մակարդակում «իմաստ փնտրելը իմաստ չունի», ապա իմաստաբանությունը հայտնվում է բառերի մակարդակում։ Դուք կարող եք բառերը բաժանել բայերի, գոյականների, մակդիրների, նախադրյալների… Կարող եք ավելի հեռուն գնալ և սահմանել դեպքեր։

Բառակապության մակարդակում իմաստաբանությունը լրացվում է կետադրական նշաններով և տրամաբանությամբ.բառակապակցություններ. Նախադասությունների մակարդակում հայտնաբերվում է իմաստաբանության ավելի կատարյալ մակարդակ, և պարբերությունը կարելի է համարել որպես ամբողջական միտք։

Օբյեկտակենտրոն զարգացումը կանխորոշում է հատկությունների և մեթոդների ժառանգությունը և առաջարկում է սկսել օբյեկտների հիերարխիան ամբողջովին վերացական նախնիի ստեղծմամբ: Միևնույն ժամանակ, անկասկած, յուրաքանչյուր հետնորդի վերլուծությունը կլինի ռեկուրսիվ և շատ դիրքերում (տառեր, բառեր, արտահայտություններ և նախադասություններ) տեխնիկական մակարդակում շատ չի տարբերվի: Պարբերությունները, ինչպես ամբողջական մտքերը, կարող են առանձնանալ այս ցանկից, բայց դրանք չեն հանդիսանում էությունը:

Կարևոր է, որ ալգորիթմի ճնշող մասը կարող է ձևակերպվել վերացական նախնիների մակարդակում՝ այն զտելով յուրաքանչյուր ժառանգի մակարդակում՝ վերացական մակարդակից կանչված տվյալների և մեթոդների միջոցով: Այս համատեքստում աբստրակցիան նոր հորիզոններ է բացում ռեկուրսիայի համար։

OOP-ի պատմական առանձնահատկությունները

OOP-ը երկու անգամ է եկել ծրագրային ապահովման աշխարհ, թեև որոշ փորձագետներ կարող են առանձնացնել ամպային հաշվարկի և օբյեկտների և դասերի վերաբերյալ ժամանակակից գաղափարների առաջացումը որպես ՏՏ տեխնոլոգիաների զարգացման նոր փուլ::

Օբյեկտ և «օբյեկտիվ» տերմինները OOP-ի ժամանակակից համատեքստում սովորաբար վերագրվում են անցյալ դարի 50-60-ականներին, բայց դրանք կապված են 1965-ի և Simula, Lisp, Algol, Smalltalk-ի առաջացման հետ:.

Այդ օրերին ծրագրավորումն առանձնապես զարգացած չէր և չէր կարող համարժեք արձագանքել հեղափոխական հայեցակարգերին: Գաղափարների և ծրագրավորման ոճերի (C / C ++ և Pascal - հիմնականում) պայքարը դեռ հեռու էր, և տվյալների բազաները դեռևս կոնցեպտուալ ձևավորված էին:

ռեկուրսիոն ռեկուրսիվ ալգորիթմներ
ռեկուրսիոն ռեկուրսիվ ալգորիթմներ

80-ականների վերջին և 90-ականների սկզբին օբյեկտները հայտնվեցին Պասկալում և բոլորը հիշում էին C/C ++ դասերը. սա նշանավորեց OOP-ի նկատմամբ հետաքրքրության նոր փուլ, և այն ժամանակ էր, որ գործիքները, հիմնականում ծրագրավորման լեզուները, դարձան ոչ: միայն աջակցում է օբյեկտի վրա հիմնված գաղափարներին, բայց զարգանում է համապատասխանաբար:

Իհարկե, եթե նախկինում ռեկուրսիվ ալգորիթմները պարզապես գործառույթներ էին, որոնք օգտագործվում էին ծրագրի ընդհանուր կոդի մեջ, ապա այժմ ռեկուրսիան կարող էր դառնալ օբյեկտի (դասակարգի) հատկությունների մաս, ինչը հետաքրքիր հնարավորություններ էր տալիս ժառանգության համատեքստում։

Ժամանակակից OOP-ի առանձնահատկությունը

OOP-ի մշակումը ի սկզբանե հայտարարված օբյեկտները (դասերը) որպես տվյալների և հատկությունների (մեթոդներ) հավաքածուներ: Իրականում խոսքը վերաբերում էր տվյալներին, որոնք ունեն շարահյուսություն և իմաստ: Բայց հետո հնարավոր չեղավ OOP-ը ներկայացնել որպես իրական օբյեկտների կառավարման գործիք։

ռեկուրսիվ ֆունկցիաներ և ալգորիթմներ
ռեկուրսիվ ֆունկցիաներ և ալգորիթմներ

OOP-ը դարձել է «համակարգչային բնույթի» օբյեկտների կառավարման գործիք: Սցենարը, կոճակը, մենյուի տարրը, ցանկի տողը, բրաուզերի պատուհանի պիտակը օբյեկտ է: Բայց ոչ մեքենա, սննդամթերք, բառ կամ նախադասություն: Իրական օբյեկտները դուրս են մնացել օբյեկտի վրա հիմնված ծրագրավորումից, և համակարգչային գործիքները նոր մարմնավորում են ստացել:

Հանրաճանաչ ծրագրավորման լեզուների տարբերությունների պատճառով առաջացել են OOP-ի շատ բարբառներ: Իմաստաբանական առումով դրանք գործնականում համարժեք են, և նրանց կենտրոնացումը գործիքային ոլորտի վրա, այլ ոչ թե կիրառականի վրա, հնարավորություն է տալիս իրական առարկաների նկարագրությունը դուրս հանել։ալգորիթմները և ապահովել դրանց միջպլատֆորմային և միջլեզու «գոյությունը»:

Կույտեր և գործառույթների կանչի մեխանիզմներ

Ֆունկցիաներ կանչելու մեխանիզմները (ընթացակարգեր, ալգորիթմներ) պահանջում են փոխանցել տվյալներ (պարամետրեր), վերադարձնել արդյունքը և հիշել օպերատորի հասցեն, որը պետք է ստանա կառավարումը ֆունկցիայի (ընթացակարգի) ավարտից հետո:

ռեկուրսիվ ալգորիթմների օրինակներ
ռեկուրսիվ ալգորիթմների օրինակներ

Սովորաբար այդ նպատակով օգտագործվում է բուրգը, չնայած ծրագրավորման լեզուները կամ ինքը՝ մշակողը, կարող են տրամադրել հսկողության փոխանցման մի շարք տարբերակներ: Ժամանակակից ծրագրավորումն ընդունում է, որ ֆունկցիայի անվանումը կարող է լինել ոչ միայն պարամետր, այլ այն կարող է ձևավորվել ալգորիթմի կատարման ժամանակ։ Ալգորիթմ կարող է ստեղծվել նաև մեկ այլ ալգորիթմ իրականացնելիս:

Ռեկուրսիվ ալգորիթմների հայեցակարգը, երբ նրանց անունները և մարմինները կարող են որոշվել առաջադրանքի ձևավորման պահին (ընտրելով ցանկալի ալգորիթմը), տարածում է ռեկուրսիվությունը ոչ միայն այն բանի վրա, թե ինչպես անել, այլ նաև, թե կոնկրետ ով պետք է. Արա. Ալգորիթմն իր «իմաստալից» անունով ընտրելը խոստումնալից է, բայց դժվարություններ է ստեղծում:

Ռեկուրսիվություն մի շարք ֆունկցիաների վրա

Չի կարելի ասել, որ ալգորիթմը ռեկուրսիվ է, երբ ինքն իրեն կանչում է և վերջ: Ծրագրավորումը դոգմա չէ, և ռեկուրսիվության հայեցակարգը բացառիկ պահանջ չէ ինքներդ ձեզ ձեր սեփական ալգորիթմի մարմնից կանչելու համար:

Միշտ չէ, որ գործնական կիրառությունները մաքուր լուծում են տալիս: Հաճախ նախնական տվյալները պետք է պատրաստվեն, և ռեկուրսիվ զանգի արդյունքը պետք է վերլուծվի ամբողջ խնդրի (ամբողջ ալգորիթմի) համատեքստում.ընդհանուր առմամբ.

Իրականում, ոչ միայն ռեկուրսիվ ֆունկցիան կանչելուց առաջ, այլ նաև այն ավարտելուց հետո կարող է կամ պետք է կանչվի մեկ այլ ծրագիր: Եթե զանգի հետ կապված հատուկ խնդիրներ չկան. A() ռեկուրսիվ ֆունկցիան կանչում է B() ֆունկցիան, որն ինչ-որ բան է անում և կանչում է A(), ապա անմիջապես առաջանում է վերահսկողության վերադարձի խնդիր: Ռեկուրսիվ կանչն ավարտելուց հետո A() ֆունկցիան պետք է ստանա կառավարում, որպեսզի նորից կանչի B(), որը նորից կկանչի այն: Վերադարձնել հսկողությունը այնպես, ինչպես որ այն պետք է լինի կարգի վրա, ետ B()-ին սխալ լուծում է:

Ծրագրավորողը սահմանափակված չէ պարամետրերի ընտրությամբ և կարող է դրանք լրացնել ֆունկցիաների անուններով: Այլ կերպ ասած, իդեալական լուծումն այն է, որ B()-ի անունը փոխանցվի A()-ին և թող A()-ն ինքն անվանի B(): Այս դեպքում հսկողության վերադարձի հետ կապված խնդիրներ չեն լինի, իսկ ռեկուրսիվ ալգորիթմի իրականացումը կլինի ավելի թափանցիկ։

Ռեկուրսիայի ըմբռնում և մակարդակ

Ռեկուրսիվ ալգորիթմների մշակման խնդիրն այն է, որ դուք պետք է հասկանաք գործընթացի դինամիկան: Օբյեկտների մեթոդներում ռեկուրսիա օգտագործելիս, հատկապես վերացական նախնիների մակարդակում, խնդիր կա հասկանալու ձեր սեփական ալգորիթմը դրա կատարման ժամանակի համատեքստում:

ռեկուրսիվ ալգորիթմների լուծում
ռեկուրսիվ ալգորիթմների լուծում

Ներկայումս չկան սահմանափակումներ ֆունկցիաների բույնի մակարդակի և կույտի հզորության վերաբերյալ կանչի մեխանիզմներում, բայց կա հասկանալու խնդիր՝ ժամանակի որ պահին տվյալների որ մակարդակը կամ ընդհանուր ալգորիթմում որ տեղն է կոչվում ռեկուրսիվ: ֆունկցիան և ինչ թվով զանգեր ունի ինքը։

Վրիպազերծման գոյություն ունեցող գործիքները հաճախ անզոր ենասա ծրագրավորողին ճիշտ լուծումը:

Օղակներ և ռեկուրսիա

Համարվում է, որ ցիկլային կատարումը համարժեք է ռեկուրսիային։ Իրոք, որոշ դեպքերում ռեկուրսիվ ալգորիթմը կարող է իրականացվել պայմանական և ցիկլային կառուցվածքների շարահյուսության մեջ:

Սակայն, եթե կա հստակ պատկերացում, որ որոշակի գործառույթ պետք է իրականացվի ռեկուրսիվ ալգորիթմի միջոցով, ապա պետք է հրաժարվել հանգույցի կամ պայմանական հայտարարությունների ցանկացած արտաքին օգտագործումից:

ռեկուրսիվ ալգորիթմների իրականացում
ռեկուրսիվ ալգորիթմների իրականացում

Այստեղ իմաստն այն է, որ ռեկուրսիվ լուծումը ֆունկցիայի տեսքով, որն օգտագործում է ինքն իրեն, կլինի ամբողջական, ֆունկցիոնալ առումով ամբողջական ալգորիթմ: Այս ալգորիթմը ծրագրավորողից կպահանջի, որ այն ստեղծի ջանքերով՝ հասկանալով ալգորիթմի դինամիկան, բայց դա կլինի վերջնական լուծումը, որը չի պահանջում արտաքին վերահսկողություն։

Արտաքին պայմանական և ցիկլային օպերատորների ցանկացած համակցություն թույլ չի տա մեզ ներկայացնել ռեկուրսիվ ալգորիթմը որպես ամբողջական ֆունկցիա:

Recursion Consensus and OOP

Ռեկուրսիվ ալգորիթմի մշակման գրեթե բոլոր տարբերակներում առաջանում է երկու ալգորիթմ մշակելու պլան: Առաջին ալգորիթմը ստեղծում է ապագա օբյեկտների (օրինակների) ցուցակ, իսկ երկրորդ ալգորիթմը իրականում ռեկուրսիվ ֆունկցիա է։

Լավագույն լուծումը կլինի ռեկուրսիան կազմակերպել որպես մեկ հատկություն (մեթոդ), որն իրականում պարունակում է ռեկուրսիվ ալգորիթմ, և ամբողջ նախապատրաստական աշխատանքը դնել օբյեկտի կառուցման մեջ:

Ռեկուրսիվ ալգորիթմը ճիշտ լուծում կլինի միայն այն դեպքում, երբ այն աշխատիմիայն իր կողմից՝ առանց արտաքին վերահսկողության և կառավարման։ Արտաքին ալգորիթմը կարող է միայն ազդանշան տալ աշխատանքի համար: Այս աշխատանքի արդյունքը պետք է լինի ակնկալվող լուծումը՝ առանց արտաքին աջակցության։

Ռեկուրսիան միշտ պետք է լինի ամբողջական ինքնուրույն լուծում:

Ինտուիտիվ հասկացողություն և ֆունկցիոնալ ամբողջականություն

Երբ օբյեկտի վրա հիմնված ծրագրավորումը դարձավ դե ֆակտո ստանդարտ, ակնհայտ դարձավ, որ արդյունավետ կոդավորելու համար դուք պետք է փոխեք ձեր սեփական մտածելակերպը: Ալգորիթմի կատարման ընթացքում ծրագրավորողը պետք է լեզվի շարահյուսությունից և իմաստաբանությունից անցնի իմաստաբանության դինամիկայի:

Ռեկուրսիայի առանձնահատկությունը. այն կարելի է կիրառել ամեն ինչի համար:

  • վեբ քերծում;
  • որոնողական գործողություններ;
  • Տեքստային տեղեկատվության վերլուծություն;
  • կարդում կամ ստեղծում MS Word փաստաթղթեր;
  • նմուշառում կամ վերլուծում պիտակներ…

ՕՕՊ-ի բնութագիրը. այն հնարավորություն է տալիս նկարագրել ռեկուրսիվ ալգորիթմ վերացական նախնիների մակարդակով, բայց նախատեսում է, որ այն վերաբերում է եզակի ժառանգներին, որոնցից յուրաքանչյուրն ունի տվյալների և հատկությունների իր ներկապնակը:

ռեկուրսիվ ալգորիթմների հայեցակարգ
ռեկուրսիվ ալգորիթմների հայեցակարգ

Ռեկուրսիան իդեալական է, քանի որ այն պահանջում է իր ալգորիթմի ֆունկցիոնալ ամբողջականությունը: OOP-ը բարելավում է ռեկուրսիվ ալգորիթմի աշխատանքը՝ դրան հասանելի դարձնելով բոլոր եզակի երեխաներին:

Խորհուրդ ենք տալիս: