Rekursiv alqoritm: təsvir, təhlil, xüsusiyyətlər və nümunələr

Mündəricat:

Rekursiv alqoritm: təsvir, təhlil, xüsusiyyətlər və nümunələr
Rekursiv alqoritm: təsvir, təhlil, xüsusiyyətlər və nümunələr
Anonim

Rekursiya haqqında müasir anlayış: funksionallığın tərifi və kənardan və bu funksionallıqdan ona giriş. Hesab olunur ki, rekursiya riyaziyyatçılar tərəfindən yaranıb: faktorial hesablama, sonsuz sıralar, fraktallar, davam edən fraksiyalar… Bununla belə, rekursiyaya hər yerdə rast gəlmək olar. Obyektiv təbii qanunlar rekursiyanı özünün əsas alqoritmi və ifadə (mövcudluq) forması kimi maddi dünyanın obyektlərinin çoxu deyil, ümumiyyətlə hərəkətin əsas alqoritmi kimi “hesab edir”.

rekursiv alqoritm
rekursiv alqoritm

Elm və texnologiyanın müxtəlif sahələrində müxtəlif ixtisaslara malik insanlar f (x) rekursiv alqoritmindən istifadə edirlər, burada "x ~/=f (x)". Özünü çağıran funksiya güclü həll yoludur, lakin bu həlli formalaşdırmaq və anlamaq əksər hallarda çox çətin işdir.

Qədim dövrlərdə saray yerini artırmaq üçün rekursiyadan istifadə edilirdi. Bir-birinə yönəlmiş güzgülər sistemi vasitəsilə siz heyrətamiz üçölçülü fəza effektləri yarada bilərsiniz. Ancaq necə başa düşmək bu qədər asandırbu güzgüləri tənzimləyin? Kosmosda bir neçə güzgü vasitəsilə əks olunan nöqtənin harada olduğunu müəyyən etmək daha çətindir.

Rekursiya, rekursiv alqoritmlər: məna və sintaksis

Əməliyyatlar ardıcıllığının təkrarlanması ilə formalaşan problem rekursiv şəkildə həll edilə bilər. Sadə alqoritm (kvadrat tənliyin hesablanması, veb səhifəni məlumatla doldurmaq üçün skript, faylı oxumaq, mesaj göndərmək…) rekursiya tələb etmir.

Rekursiv həllə imkan verən alqoritmin əsas fərqləri:

  • bir neçə dəfə icra edilməli olan alqoritm var;
  • alqoritm hər dəfə dəyişən dataya ehtiyac duyur;
  • alqoritmin hər dəfə dəyişməsi lazım deyil;
  • son şərt var: alqoritm rekursivdir - sonsuz deyil.

Ümumiyyətlə, birdəfəlik icranın rekursiya üçün səbəbin olmaması üçün zəruri şərt olduğunu mübahisə etmək olmaz. Siz həmçinin məcburi yekun şərt tələb edə bilməzsiniz: sonsuz rekursiyaların öz əhatə dairəsi var.

Alqoritm rekursivdir: əməliyyatlar ardıcıllığı dəfələrlə yerinə yetirildikdə, hər dəfə dəyişən və hər dəfə yeni nəticə verən verilənlər üzərində.

Rekursiya düsturu

Rekursiyanın riyazi anlayışı və onun proqramlaşdırmada analoqu fərqlidir. Riyaziyyat, proqramlaşdırmanın əlamətləri olsa da, proqramlaşdırma daha yüksək səviyyəli riyaziyyatdır.

rekursiv alqoritm f
rekursiv alqoritm f

Yaxşı yazılmış alqoritm müəllifinin intellektinin güzgüsü kimidir. Generalproqramlaşdırmada rekursiya düsturu "f(x)"dir, burada "x ~/=f(x)" ən azı iki şərhə malikdir. Burada "~" nəticənin oxşarlığı və ya olmaması, "=" isə funksiyanın nəticəsinin olmasıdır.

Birinci seçim: data dinamikası.

  • f(x)" funksiyası rekursiv və dəyişməz alqoritmə malikdir;
  • "x" və "f(x)" nəticəsi hər dəfə yeni dəyərlərə malikdir, "f(x)" nəticəsi bu funksiyanın yeni "x" parametridir.

İkinci seçim: kod dinamikası.

  • "f(x)" funksiyası verilənləri dəqiqləşdirən (təhlil edən) bir neçə alqoritmə malikdir;
  • data təhlili - kodun bir hissəsi və istənilən hərəkəti yerinə yetirən rekursiv alqoritmlərin həyata keçirilməsi - kodun ikinci hissəsi;
  • "f(x)" funksiyasının nəticəsi deyil.

Heç bir nəticə normal deyil. Proqramlaşdırma riyaziyyat deyil, burada nəticənin açıq şəkildə olması lazım deyil. Rekursiv funksiya sadəcə saytları təhlil edə və verilənlər bazasını doldura və ya daxil olan daxiletməyə uyğun olaraq obyektləri nümunələndirə bilər.

Data və rekursiya

Rekursiv alqoritmlərin proqramlaşdırılması faktorialın hesablanması ilə bağlı deyil, burada funksiya hər dəfə birdən çox və ya bir az olan verilmiş dəyəri qəbul edir - həyata keçirmə seçimi tərtibatçının seçimindən asılıdır.

Faktorial "8!"-in necə olmasının fərqi yoxdur,bu düstura ciddi şəkildə əməl edən alqoritm.

İnformasiyanın işlənməsi tamamilə fərqli bir nizamın "riyaziyyatıdır". Burada rekursiv funksiyalar və alqoritmlər hərflər, sözlər, ifadələr, cümlələr və paraqraflar üzərində işləyir. Hər növbəti səviyyə əvvəlkindən istifadə edir.

Giriş məlumat axını geniş şərtlər daxilində təhlil edilir, lakin təhlil prosesi ümumiyyətlə rekursivdir. Giriş axınının bütün variantları üçün unikal alqoritmlər yazmağın mənası yoxdur. Bir funksionallıq olmalıdır. Burada rekursiv alqoritmlər girişə adekvat olan çıxış axınının necə formalaşdırılacağına dair nümunələrdir. Bu, rekursiv alqoritmin nəticəsi deyil, lakin arzu olunan və zəruri həll yoludur.

Abstraksiya, rekursiya və OOP

Obyekt yönümlü proqramlaşdırma (OOP) və rekursiya prinsipial olaraq fərqli obyektlərdir, lakin onlar bir-birini mükəmməl şəkildə tamamlayır. Abstraksiyanın rekursiya ilə heç bir əlaqəsi yoxdur, lakin OOP obyektivi vasitəsilə kontekstli rekursiyanı həyata keçirmək imkanı yaradır.

Məsələn, məlumat təhlil edilir və hərflər, sözlər, ifadələr, cümlələr və paraqraflar ayrıca vurğulanır. Aydındır ki, tərtibatçı bu beş növ obyektlərin nümunələrinin yaradılmasını təmin edəcək və hər səviyyədə rekursiv alqoritmlərin həllini təklif edəcək.

rekursiv alqoritmlərin proqramlaşdırılması
rekursiv alqoritmlərin proqramlaşdırılması

Bu arada əgər hərflər səviyyəsində “məna axtarmağın mənası yoxdur”sa, sözlər səviyyəsində semantika yaranır. Siz sözləri fellərə, isimlərə, zərflərə, ön sözlərə ayıra bilərsiniz… Siz daha da irəli gedə və halları müəyyən edə bilərsiniz.

İfadə səviyyəsində semantika durğu işarələri və məntiqlə tamamlanırsöz birləşmələri. Cümlələr səviyyəsində semantikanın daha mükəmməl səviyyəsi tapılır və abzas tam fikir hesab oluna bilər.

Obyekt yönümlü inkişaf xassələrin və metodların varisliyini əvvəlcədən müəyyən edir və obyektlərin iyerarxiyasına tamamilə mücərrəd əcdadın yaradılması ilə başlamağı təklif edir. Eyni zamanda, şübhəsiz ki, hər bir nəslin təhlili rekursiv olacaq və bir çox mövqelərdə (hərflər, sözlər, ifadələr və cümlələr) texniki səviyyədə çox fərqlənməyəcəkdir. Tam fikirlər kimi abzaslar bu siyahıdan fərqlənə bilər, lakin onlar mahiyyət deyil.

Alqoritmin böyük hissəsinin mücərrəd səviyyədən çağırılan məlumat və metodlarla hər bir nəslin səviyyəsində onu dəqiqləşdirərək, mücərrəd əcdad səviyyəsində tərtib oluna bilməsi vacibdir. Bu kontekstdə abstraksiya rekursiya üçün yeni üfüqlər açır.

OOP-un tarixi xüsusiyyətləri

OOP iki dəfə proqram təminatı dünyasına gəlib, baxmayaraq ki, bəzi ekspertlər bulud hesablamalarının meydana çıxmasını və obyektlər və siniflər haqqında müasir ideyaları İT texnologiyalarının inkişafında yeni mərhələ kimi qeyd edə bilərlər.

OOP-in müasir kontekstində "obyekt" və "obyektiv" terminləri adətən ötən əsrin 50-60-cı illərinə aid edilir, lakin onlar 1965-ci il və Simula, Lisp, Algol, Smalltalk-ın yaranması ilə əlaqələndirilir..

O dövrlərdə proqramlaşdırma xüsusilə inkişaf etməmişdi və inqilabi konsepsiyalara adekvat cavab verə bilməzdi. İdeyalar və proqramlaşdırma üslubları (C / C ++ və Paskal - əsasən) mübarizəsi hələ çox uzaqda idi və verilənlər bazaları hələ də konseptual olaraq formalaşmışdı.

rekursiv rekursiv alqoritmlər
rekursiv rekursiv alqoritmlər

80-ci illərin sonu və 90-cı illərin əvvəllərində Paskalda obyektlər peyda oldu və hər kəs C / C ++ dilində dərsləri xatırladı - bu, OOP-a marağın yeni dövrünü qeyd etdi və məhz o zaman alətlər, ilk növbədə proqramlaşdırma dilləri yox oldu. yalnız obyekt yönümlü ideyaları dəstəkləyin, lakin müvafiq olaraq inkişaf edin.

Əlbəttə, əgər əvvəllər rekursiv alqoritmlər sadəcə proqramın ümumi kodunda istifadə olunan funksiyalar idisə, indi rekursiya irsiyyət kontekstində maraqlı imkanlar verən obyektin (sinif) xassələrinin bir hissəsinə çevrilə bilərdi.

Müasir OOP xüsusiyyəti

OOP-in inkişafı ilkin olaraq obyektləri (sinifləri) məlumat və xassələrin (metodların) toplusu kimi elan etdi. Əslində, söz sintaksisi və mənası olan məlumatlardan gedirdi. Lakin o zaman OOP-ni real obyektlərin idarə edilməsi üçün alət kimi təqdim etmək mümkün olmadı.

rekursiv funksiyalar və alqoritmlər
rekursiv funksiyalar və alqoritmlər

OOP "kompüter təbiəti" obyektlərinin idarə edilməsi üçün alətə çevrilib. Skript, düymə, menyu elementi, menyu çubuğu, brauzer pəncərəsindəki etiket obyektdir. Amma maşın, qida məhsulu, söz və ya cümlə deyil. Real obyektlər obyekt yönümlü proqramlaşdırmadan kənarda qaldı və kompüter alətləri yeni təcəssüm aldı.

Məşhur proqramlaşdırma dillərindəki fərqlərə görə, OOP-un bir çox dialektləri yaranmışdır. Semantika baxımından onlar praktiki olaraq ekvivalentdirlər və onların diqqəti tətbiq sahəsinə deyil, instrumental sferaya yönəltməsi real obyektlərin təsvirini bu çərçivədən kənara çıxarmağa imkan verir.alqoritmləri qurun və onların platformalararası və dillər arası "mövcudluğunu" təmin edin.

Staklar və funksiya çağırış mexanizmləri

Funksiyaları (prosedurlar, alqoritmlər) çağırmaq üçün mexanizmlər verilənlərin (parametrlərin) ötürülməsini, nəticənin qaytarılmasını və funksiya (prosedur) tamamlandıqdan sonra nəzarəti qəbul etməli olan operatorun ünvanını yadda saxlamağı tələb edir.

rekursiv alqoritmlərə nümunələr
rekursiv alqoritmlərə nümunələr

Adətən, bu məqsəd üçün yığın istifadə olunur, baxmayaraq ki, proqramlaşdırma dilləri və ya tərtibatçının özü idarəetmənin ötürülməsi üçün müxtəlif seçimlər təqdim edə bilər. Müasir proqramlaşdırma etiraf edir ki, funksiyanın adı təkcə parametr ola bilməz: o, alqoritmin icrası zamanı formalaşa bilər. Alqoritm digər alqoritm icra edilərkən də yaradıla bilər.

Rekursiv alqoritmlər konsepsiyası, onların adlarını və gövdələrini tapşırığın formalaşması zamanı (arzu olunan alqoritmin seçilməsi) müəyyən etmək mümkün olduqda, rekursivliyi təkcə nəyinsə necə edilməsinə deyil, həm də tam olaraq kimin etməli olduğuna da şamil edilir. et bunu. "Mənalı" adına görə alqoritmin seçilməsi perspektivlidir, lakin çətinliklər yaradır.

Bir sıra funksiyalar üzrə rekursivlik

Bir alqoritmin özünü çağırdığı zaman rekursiv olduğunu deyə bilməzsiniz və bu belədir. Proqramlaşdırma dogma deyil və rekursivlik anlayışı öz alqoritminizin əsas hissəsindən özünüzü çağırmaq üçün müstəsna tələb deyil.

Praktik tətbiqlər həmişə təmiz bir həll vermir. Çox vaxt ilkin məlumatlar hazırlanmalı və rekursiv çağırışın nəticəsi bütün problemin (bütün alqoritm) kontekstində təhlil edilməlidir.ümumi.

Əslində, təkcə rekursiv funksiya çağırılmamışdan əvvəl deyil, həm də tamamlandıqdan sonra başqa proqram çağırıla bilər və ya çağırılmalıdır. Zənglə bağlı heç bir xüsusi problem yoxdursa: rekursiv A() funksiyası nəyisə yerinə yetirən B() funksiyasını çağırır və A() funksiyasını çağırır, onda dərhal idarəetmənin qaytarılması ilə bağlı problem yaranır. Rekursiv çağırışı tamamladıqdan sonra A() funksiyası onu yenidən çağıracaq B() funksiyasını yenidən çağırmaq üçün nəzarəti qəbul etməlidir. Nəzarəti stekdəki qaydada B()-ə qaytarmaq səhv həlldir.

Proqramçı parametrlərin seçimində məhdud deyil və onları funksiya adları ilə tamamlaya bilər. Başqa sözlə, ideal həll yolu B()-nin adını A()-a ötürmək və A()-ın özünü B() adlandırmaqdır. Bu halda nəzarətin qaytarılması ilə bağlı heç bir problem olmayacaq və rekursiv alqoritmin həyata keçirilməsi daha şəffaf olacaq.

Rekursiyanın başa düşülməsi və səviyyəsi

Rekursiv alqoritmlərin işlənib hazırlanmasında problem ondan ibarətdir ki, siz prosesin dinamikasını başa düşməlisiniz. Obyekt metodlarında, xüsusən də mücərrəd əcdad səviyyəsində rekursiyadan istifadə edərkən, öz alqoritminizi onun icra müddəti kontekstində başa düşmək problemi var.

rekursiv alqoritmlərin həlli
rekursiv alqoritmlərin həlli

Hazırda çağırış mexanizmlərində funksiyaların yuva səviyyəsinə və stek tutumuna dair heç bir məhdudiyyət yoxdur, lakin başa düşmək problemi var: zamanın hansı nöqtəsində hansı məlumat səviyyəsi və ya ümumi alqoritmdə hansı yer rekursiv adlanır funksiyası və o, neçə dəfə zəng edir.

Mövcud sazlama alətləri çox vaxt gücsüz olurproqramçıya düzgün həlli deyin.

Döngülər və rekursiya

Diklik icranın rekursiyaya bərabər olduğu hesab edilir. Həqiqətən də, bəzi hallarda rekursiv alqoritm şərti və siklik konstruksiyaların sintaksisində həyata keçirilə bilər.

Lakin müəyyən funksiyanın rekursiv alqoritm vasitəsilə həyata keçirilməli olduğu aydın anlayış varsa, dövrə və ya şərti ifadələrin hər hansı xarici istifadəsindən imtina edilməlidir.

rekursiv alqoritmlərin həyata keçirilməsi
rekursiv alqoritmlərin həyata keçirilməsi

Buranın mənası ondan ibarətdir ki, özündən istifadə edən funksiya şəklində rekursiv həll tam, funksional olaraq tam alqoritm olacaqdır. Bu alqoritm proqramçıdan alqoritmin dinamikasını başa düşərək onu səylə yaratmağı tələb edəcək, lakin bu, xarici nəzarət tələb etməyən son həll olacaq.

Xarici şərti və siklik operatorların hər hansı birləşməsi rekursiv alqoritmi tam funksiya kimi təqdim etməyə imkan verməyəcək.

Rekursiya Konsensusu və OOP

Rekursiv alqoritmin işlənib hazırlanmasının demək olar ki, bütün variantlarında iki alqoritmin hazırlanması planı yaranır. Birinci alqoritm gələcək obyektlərin (nümunələrin) siyahısını yaradır və ikinci alqoritm əslində rekursiv funksiyadır.

Ən yaxşı həll rekursiyanı əslində rekursiv alqoritmi ehtiva edən vahid xassə (metod) kimi təşkil etmək və bütün hazırlıq işlərini obyekt konstruktoruna qoymaq olardı.

Rekursiv alqoritm yalnız işlədiyi zaman düzgün həll olacaqkənar nəzarət və idarəetmə olmadan yalnız özü tərəfindən. Xarici alqoritm yalnız işləmək üçün siqnal verə bilər. Bu işin nəticəsi xarici dəstək olmadan gözlənilən həll olmalıdır.

Rekursiya həmişə tam müstəqil həll olmalıdır.

İntuitiv anlayış və funksional tamlıq

Obyekt yönümlü proqramlaşdırma de-fakto standarta çevriləndə aydın oldu ki, effektiv kodlaşdırmaq üçün öz düşüncənizi dəyişmək lazımdır. Proqramçı alqoritmin icrası zamanı dilin sintaksisi və semantikasından semantikanın dinamikasına keçməlidir.

Rekursiyanın xüsusiyyəti: hər şeyə tətbiq oluna bilər:

  • veb kazıma;
  • axtarış əməliyyatları;
  • mətn məlumatının təhlili;
  • MS Word sənədlərini oxumaq və ya yaratmaq;
  • teqlərin seçilməsi və ya təhlili…

OOP-in xarakterik xüsusiyyətləri: o, mücərrəd əcdad səviyyəsində rekursiv alqoritmi təsvir etməyə imkan verir, lakin onun hər birinin öz məlumat və xassələri palitrasına malik olan unikal nəsillərə istinad etməsini təmin edir.

rekursiv alqoritmlər anlayışı
rekursiv alqoritmlər anlayışı

Rekursiya idealdır, çünki onun alqoritminin funksional tamlığını tələb edir. OOP bütün unikal uşaqlara giriş verməklə rekursiv alqoritmin performansını yaxşılaşdırır.

Tövsiyə: