altprogramı çağırıp (altprogramın kendi kendisi olduğunu bir an unuta- hm), işini yaptırdıktan sonra kaldığı yerden devam edebilmesi sağlanmış- tır. Zaten programımız nerede oldu- Bunun farkına varamazsa sonsuz dön- gülere girecek ve ana işlem ünitesinin yığınını tümüyle doldurup *OUT OF MEMORY ERROR' mesajı ile başa- rısız bir biçimde sonuçlanacaktır. RECURSIÖON tipi programlar bir veri yapısı üzerinde çalışırlar ve bu ve- ri yapısını değiştirirler (zaten sonuç olarak yapılan net iş budur). Bu ça- lışma alanı altprogram hangi seviye- de olursa olsun, erişilebilir ve diğer se- viyelerinde görebileceği biçimde değiş- tirilebilir olmalıdır. Bu uzun ve kar- maşık cümlenin ne anlama geldiğini birazdan vereceğim örneklerle açıkla- yacağım. Burada vereceğim örnekler birçok bilgisayar programcısının aklına takı- lan veya merak ettiği ve büyük ihti- malle kafasını karıştırıp vazgeçtiği ko- nuları içermektedir. Mesela: * Satranç nasıl oynanır? ÖNERİ: Bir altprogramımız olsa; diyelim ki yaptığı iş “belli bir pozis- yonda olabilecek tüm hedefleri değer- lendirmek” olduğu zaman içinde di- Ber karşı ihtimalleri ve karşı ihtimal- lerin karşı ihtimallerini vs. değerlen- dirmek için kendi kendini çağırması gerekecektir ve bu program “RE- CURSIİVE” çalışarak sorunu çözecek- tir. Ne güzel değil mi? * Bir BASIC satırının içindeki kar- makarışık bir matematiksel işlemin değeri nasıl hesaplanır? ÇÖZÜM: COMMODORE 64'ü- müzün BASIC ROM'unda FRMEVL adında bir altprogram vardır. Bu alt- program çağırıldığında yukarıda söy- lenen işi yapar. İşlemler soldan sağa okunur; fakat matematiksel olarak bu sırada yürümesi şart değildir. Bu da önemli bir sorun teşkil eder. İşlem sı- rası çoğu zaman “soldan sağa”' ölçü- süne uymaz. Mesela işlemsel öncelik- lere göre (Örneğin: çarpma veya böl- me işlemi, toplama veya çıkarma iş- lemlerinden önce yapılır) veya paran- tezlerle işlenme yönü belirtilmişse. Bu- na göre işlem önceliği sağ taraftaki ar- gümanı bilmeyi gerektiriyorsa FRMEVL o ana kadarki bulduğu de- Beri yığına atar ve sağ taraftaki argü- manı hesaplaması için kendi kendini çağırır. Gelen sonuçla yığından geri al- dığı ilk sonuç arasında daha düşük ön- celikli işlemi yapar. Böylece şunlar Z sağlanır: Satır soldan sağa işlenir. (Za- ten başka türlü bir çözüm saçma ve karışık olurdu.) Ayrıca dilendiği ka- dar işlem belirli öncelik sırasıyla oluş- turulur ve gerçekten hatasız olarak bu sırada işlenmesi gerçekleşir. * Grafik ekranında bir resmimiz ol- sun. Boş olan bir bölümünü boya dö- ker gibi doldurmak istiyoruz. Ne yap- malıyız? ÇÖZÜM: Burada gene RECURSI- ON imdadımıza yetişiyor. Bir altprog- ram yazarız. Yaptığı iş belli bir koor- dinatta çevresine bakar ve uygun yer- leri doldurarak yoluna devam eder, şayet herhangi bir yerde yolu birkaç ihtimale çıkarsa o koordinatı yığına atar, ihtimallerden birini seçer, ken- di kendini çağırarak o yönde doldur- ma işleminin devamını sağlar. Böyle bir grafik programının çalışmasını gördüyseniz bu özelliği de görmüşsü- nüzdür. İhtimaller birçok yerde dal- lanır budaklanır, program ise ihtimal- fasında bir ışık yakmış ve ufkunu ge- nişletmiş olmasıdır. Başta da dediğim gibi, konuya sakin bir şekilde paniğe kapılmadan yaklaşılırsa gerçekten de çözüm bulunabiliyor. Ben şimdi bu örneklere bir dördün- cüsünü ekleyeceğim. Fakat bu örnek, diğer örnekler gibi kalmayacak. Bu ör- neği aynı zamanda hayata kavuştura- cağız. Heyecanlanan genç programci arkadaşlar isterlerse burada kısa bir ara verip, zihinlerini toplayıp tekrar yazının başına oturabilirler. Örneğimiz fare ve labirentle yapı- lan denemeler üzerine. Yalnız bizim faremiz köku alamıyor. Yollara girip çıkıp deneme-yanılma yöntemiyle yo- lu bulacak. Fakat daha evvel girdiği yollara bir daha girmeyecek. Yoksa bir bölgenin etrafında dönüp durma- sını kimse engelleyemez. İsterseniz fareyi bir kenara bırakıp, olaya daha sade bakalım. Olay bazı gazetelerin bulmaca köşelerinde ver- PROBLEMİN ÇüZüMü (SARAT,DAK İKA,SANIYE : GEÇEN ZAMAN BAŞLANGCIÇ ŞEKLİ Hok o kokakokakak deak ol *5 * MAHASA AAA k * * * tttttt AttK * * KtR4AtAAAA4 * * * k OH4ttt tA * * YAt SEK Kokokokokokok lll d g0düli Mokokakkok deak a ok li *#SCCCCCCCCOC * MA tHAAAAAAACIK *CCCCCCCCECCE £ KÜt A H4 Hk *CCCCCCCCCC * MA AAA AA ADK *CCCCCCCCCOC * Ü H4 AAA AAA k *CCCCÜCCECCC * AAA ASE K oK okokakok okokakoökk lerden birini seçerek yoluna devam eder. O anlık öteki ihtimali (veya ih- timalleri) bırakır. Fakat eninde sonun- da o noktaya geri döner ve işini ku- sursuz olarak bitirir. Programın bun- ca fazla ihtimale karşı yapacağı işi unutmamasını sağlayan,yığının kulla- nılmasıdır. Umudumuz yukarıdaki üç örneğin birçok bilgisayar programcısının ka- u:i% ö BEBER dikleri problemler gibi bir labirent içinde bir noktadan başka bir nokta- ya gitme olayından başka bir şey de- Bil. Çalışmamızı öncelikle programın yalnızca rekursif altprogram bölümü üzerinde yoğunlaştıralım. Geri kalan iş süsleme, ekran hazırlama tipinde olacağı için onları ayrı tutalım. Onları nasıl olsa yaparız. Bizi esas uğraştıra-