1.Programlama Nedir?
Bir bilgisayar bilimcisi gibi düşünmek ve programlama ne demektir? Bu düşünme şekli matematiğin, mühendisliğin ve doğa bilimlerinin bazı özelliklerini birleştirmektedir. Bilgisayar bilimcileri genel olarak matematiksel sembolleri, işlemleri ve formülleri kullanır, mühendisler gibi tasarım yaparak farklı sistemler oluşturur ve bilim insanları gibi deney yaparak teknoloji desteği ile çözüm üretir.
Bir bilgisayar bilimcisi için en önemli beceri problem çözme becerisidir. Problem çözme; problemleri formüle edebilme, farklı ve yaratıcı çözüm yolları önerebilme, çözümü kesin ve doğru biçimde ifade edebilme becerisidir. Programlamayı öğrenme sürecinde yalnızca problem çözme becerisi yeterli değildir çünkü programlama aynı zamanda bir düşünme biçimidir. Bir insan makine değildir, o yüzden o şekilde düşünmeye zorlanamaz. Ancak, bilgiyi işleme süreçleri vardır ve verileri yorumlama, dönüştürme ve sunma gibi farklı süreçlerin yaratıcı düşünme ile desteklenmesi çok önemlidir. Programlama hem problem çözme becerisi hem de bilgi işlemsel düşünme becerisine sahip olmayı gerektirir. Bilgi işlemsel düşünme; bilgisayar biliminin kavramlarından yararlanarak problem çözme, sistem tasarlama ve insan davranışlarını anlama olarak tanımlanabilir. Ayrıca Bilgisayar Bilimi Öğretmenleri Birliği (Computer Science Teachers Association – CSTA) ve Uluslararası Eğitimde Teknoloji Topluluğu (International Society for Teachnology in Education – ISTE) tarafından tanımlandığı şekliyle bilgi işlemsel düşünme aşağıdaki özellikleri barındıran bir problem çözme sürecidir.
Problemleri bilgisayar veya başka araçlar yardımı ile çözebilir hâle getirme
Mantıklı bir şekilde verileri düzenleme ve çözümleme
Model ve benzetim desteği ile verileri sunma
Algoritmik düşünme çerçevesinde çözümleri otomatikleştirme
Kaynakları verimli bir şekilde kullanarak uygun çözümleri tanımlama, çözümleme ve uygulama
Bulunan çözümü farklı problemlere transfer etme ve genelleştirme
Bilgi işlemsel düşünme becerisi; problem çözümleme, veri sunma ve modelleme gibi bazı benzer kavramlar ile ilişkili görülmekte ve sadece bilgisayar bilimcileri için değil, herkes için gerekli temel bir beceri olarak tanımlanmaktadır. Bilgi işlemsel düşünme sayesinde siz öğrenciler bilgisayarlar ile çözümlerini otomatik hâle getirip problemleri daha etkili çözebilecek ve düşünmenin sınırlarını genişletebileceksiniz. Dahası, bilgisayar biliminin kavramlarını ve ilkelerini öğrendiğiniz zaman gittikçe değişen teknolojik hayata ve iş yaşamına daha iyi hazırlanabileceksiniz. Bilgisayarın bilgi işleme süreci ile benzerlik gösteren düşünme yaklaşımıyla, değişen araçlar ve uygulamalardan etkilenmeden, yaşam boyu öğrenen bireyler olabileceksiniz.
Farklı bir bakış açısı ile programlama; bilgisayarın donanıma nasıl davranacağını anlatan, bilgisayara yön veren komutlar ve işlemler bütünüdür. Kısaca yazılım geliştirme, test etme ve bakımını yapma sürecidir.
Bir programlama sisteminin iki bileşeni vardır:
Bilgisayara kurulmuş olan bileşen − programlama ortamı
Programcı tarafından oluşturulan algoritma ve program kodları
Kullandığımız programlama ortamı ile programcı tarafından kullanılacak kelime ve komutları oluşturur, program akışını ve mevcut durumu kontrol edebilir, adım adım işlemleri takip edebilir, oluşturduğumuz işlemleri genelleştirerek soyutlaştırabiliriz. Kullandığımız programlama dili ile yapmak istediğimiz işlemleri bilgisayarın anlayacağı biçimde ifade edebilir, işlemleri parçalara bölebilir, parçalardan farklı ve anlamlı bütünler oluşturabiliriz.
2.Program Nedir?
Program, yapılacak bir işlemi ya da hesaplamayı gerçekleştirmek için birbirini izleyen komut ya da yönergelerden oluşan yapıdır. İşlemler matematiksel ya da mantıksak olabilir. Örneğin bir formülün sonucunun hesaplanması ya da bir doküman içerisinde belirli bir metnin aranması gibi. Ayrıntılar programlama dillerine göre farklılaşsa bile belirli komutlar her dilde yer alır.
Girdi: Klavyeden, dosyadan veya başka bir aygıttan veri almadır.
Çıktı: Ekranda veriyi görüntüleme veya veriyi dosyaya veya başka bir aygıta göndermedir.
Matematik: Toplama, çarpma gibi bazı temel matematiksel işlemleri gerçekleştirmedir.
Koşullu yürütme: Belirli durumları sınamak ve komutları uygun bir sıraya göre çalıştırmaktır.
Tekrarlama: Bazı eylemleri genellikle ufak tefek değişikliklerle yineleme işlemidir.
Programların çoğu, ne kadar basit ya da karmaşık olursa olsun temel olarak bu işlemlere dayalı olarak çalışır. Bu nedenle programlama, büyük ve karmaşık bir görevi bu temel komutlarla gerçekleştirebilecek kadar basit biçimde küçük alt görevlere bölme olarak tanımlanabilir.
3.Hata Ayıklama Nedir?
Programlama, karmaşık bir süreçtir ve programcılar programlamada hata (bug) yapabilirler. Programlama hatalarını bulma ve düzeltme işlemine hata ayıklama (debugging) denilir. Bir programda üç tür hata oluşabilir: Söz dizimsel hatalar, çalışma zamanı hataları ve anlam bilimsel hatalar.
Söz dizimsel hatalar: Söz dizimi, programın yapısı ve bu yapı hakkındaki kurallar demektir. Örneğin Türkçede bir cümle büyük harfle başlamalı ve uygun bir noktalama işaretiyle sona ermelidir. Bu kurallara uymayan cümlelere “Söz dizimi hatası içermektedir.” diyebiliriz. Programlama dilleri için söz dizimi, yoruma açık olmayacak şekilde kesin ve net ifadeler içermelidir. Aksi takdirde program, söz dizimi hatası verir ve programın doğru çalışmasını bekleyemeyiz.
Çalışma zamanı hataları: Bu hatalar ancak program çalıştırıldıktan sonra ortaya çıkar. Hesaplanması mümkün olmayan işlemler (sıfıra bölünme) ya da hiç gerçekleşmeyecek koşulların (5<3) yürütülmesi gibi durumlarda ortaya çıkar.
Anlam bilimsel hatalar: Bu durumda program, genellikle hata vermeden çalışır ancak çoğu zaman beklenen sonucu üretmez. Bu yüzden programı satır satır çalıştırarak, farklı adımlardaki çıktıları gözlemleyerek nerede mantık hatası yapıldığını bularak program doğru biçimde çalışana kadar bu hataları ayıklamak gerekir. Programlamayı öğrenirken kazanılacak önemli becerilerden biri de hata ayıklamadır. Yorucu olmasına rağmen, programlamada bilişsel yoğunluk gerektiren ilginç bir süreçtir. Hata ayıklama deneysel bir yaklaşımdır.
Neyin hatalı gittiğine dair bir fikir oluştuğunda programı değiştirerek tekrar çalıştırırız. Böylece programlamaya yeni bir boyut daha kazandırmış oluruz. Programlama, program doğru biçimde çalışana kadar aşamalı olarak hata ayıklama sürecidir.
4.Günlük Hayatta Problem Çözme
Günlük hayatımızda problemlerimizi çözmek için yaşantımızı etkileyen pek çok karar veririz. Bu kararlar yalnızca yaşantımızı etkilemekle kalmaz, bazen yaşam kalitemizi ve geleceğimizi bile etkileyebilir. Örneğin karşılaştığımız problemler, televizyonda hangi kanalı seyretsem gibi basit de olabilir, hangi mesleği seçmeliyim gibi çok önemli de olabilir. Yanlış bir karar verilirse zaman ve kaynaklar boşa gidebilir, bu nedenle nasıl doğru karar verildiğini öğrenmek önemlidir. En iyi kararı vermek aslında problem çözmektir. İnsan hayatı aslında bir problem çözme sürecidir.
Genellikle bir problemin birden fazla çözümü vardır, her bir çözüm bir alternatif olarak düşünülebilir. Problem çözme, amaca ulaşabilmek için alternatifler arasından en uygun yolu belirlemektir. Alternatifler, farklı koşul ve beklentilere göre şekillenir. En uygun çözüm ise farklı koşul ve durumlar için değişiklik gösterebilir. Bu nedenle farklı kişiler ve problemler için çözüm önerileri de farklılık gösterebilir. Problemler çözülmeye çalışılırken dikkate alınması gereken sınırlılıklar ve koşullar ile uyulması gereken kurallar vardır. Tüm bu veriler dikkate alınmaz ise doğru çözüme ulaşılamaz ya da problem geçici olarak göz ardı edilmiş olabilir.
Bir problemi yazılım geliştirerek çözerken de çeşitli sınırlılıklar vardır: kullandığınız programlama dili, çalıştığınız ortam (kişisel bilgisayar, tablet vb.) ve performans (kullandığınız işlemci, hafıza, disk vb.). Bu nedenle programcılar için problem çözme, “bir dizi işlemi, belirtilen sınırlılıklara uygun biçimde gerçekleştirebilen programın yazılması” anlamına gelir. Programlamaya yeni başlayanlar işlemleri gerçekleştirip hedefe ulaşma konusunda daha fazla istekli olduklarından genellikle belirtilen sınırlılıklara uyma konusunda zorluk yaşayabilirler. Bu nedenle böyle programlar, istenilen işlemleri yalnızca “belli şartlarda (sadece 2 basamaklı sayılar için, tek bir döngü için vb.)” yerine getirebilen programlara dönüşebilir. Bu nedenle bu tür uygulama hatalarından kaçınarak tüm detayları dikkatli bir şekilde işe koşarak programlama yapmamız son derece önemlidir.
5.Problem Çözme Süreci
Problem çözme farklı biçimlerde düşünmeyi gerektiren bir eylemdir. Öncelikle klasikleşmiş bazı klasik bulmacaları ve bu bulmacaların çözümlerini inceleyelim.
5.1. Tilki, Kaz ve Mısır Çuvalı
Konuşacağımız ilk klasik problem, beraberindeki nesneleri nehrin karşısına taşıması gereken bir çiftçiyle ilgili bir bulmaca. Bu çiftçinin bir tilkiyi, bir kazı ve bir mısır çuvalını nehrin karşısına geçirmesi gerekmektedir. Çiftçinin bu işlemi gerçekleştirmek için küçük bir teknesi var ancak bu teknede çiftçi ile birlikte en fazla bir nesneye daha yer var. Ne yazık ki tilki ve kaz açtır. Bu yüzden tilki kaz ile yalnız kalamaz çünkü tilki kazı yiyebilir. Aynı şekilde kaz ve mısır çuvalı yalnız bırakılamaz çünkü kaz mısırı yiyebilir. Bu koşullarda çiftçi nehrin karşısına tilki, kaz ve mısırı sorunsuz bir şekilde nasıl geçirebilir?
Bu soru yukarıdaki şekilde görülmektedir. Bu soruna daha önce hiç rastlamadıysanız burada durun ve çözmek için birkaç dakika harcayın. Bu bilmeceyi daha önce duyduysanız ve çözdüyseniz nasıl çözüm bulduğunuzu hatırlamaya çalışın.
Tekne ile aynı anda en fazla iki nesne taşınabildiğini biliyoruz. Tilki ve kaz aynı kıyıda yalnız bırakılamayacağı gibi kaz da mısır çuvalıyla aynı kıyıda yalnız bırakılamaz.
Bu bilmeceyi bir ipucu olmadan çözmekte zorlanabiliriz. İşte mantık yürütme biçimi. Çiftçi her seferinde nesnelerden birini alabileceğinden çiftçinin her şeyi kıyıya götürmek için birden fazla gidip gelmesi gerekecektir. İlk gidiş sırasında çiftçi tilkiyi alırsa kaz, mısır çuvalıyla yalnız kalır ve kaz mısırı yiyebilir. Aynı şekilde çiftçi ilk gidiş sırasında mısır çuvalını alacak olursa tilki kaz ile yalnız kalacak ve tilki kazı yiyecektir. Bu nedenle çiftçi ilk turda kazı almalıdır.
Artık çözümü bildiğimize göre problemi daha biçimsel ifade etmeyi deneyebiliriz. Öncelikle kısıtlamaları listeleyeceğiz.
Buradaki anahtar kısıtlamalar şunlardır:
Çiftçi tekne içerisine tek seferde kendisi dışında yalnızca bir nesne daha alabilir.
Tilki ve kaz aynı kıyıda yalnız bırakılamaz.
Kaz ve mısır aynı kıyıda yalnız bırakılamaz.
Bu problem, kısıtlamaların önemini ortaya koyan iyi bir örnektir. Bu kısıtlamalardan herhangi birini kaldırırsak bulmaca kolay hâle gelir. İlk kısıtlamayı kaldırırsak üç ögeyi tek bir turda alabiliriz. Tekneye sadece iki öge alsak bile tilki ve mısır çuvalını alıp kaz için geri dönebiliriz. İkinci kısıtlamayı kaldırırsak (ancak diğer kısıtlamaları yerinde bırakırsak) önce kaz, sonra tilki ve sonunda mısırı alabiliriz. Kaz ve mısırda dikkatli olmamız gerekir. Bu nedenle kısıtlamaların herhangi birini unutursak veya yok sayarsak problemi doğru bir şekilde çözemeyiz.
Sonra, işlemleri listeleyelim. Bu bulmacanın işlemlerini belirlemenin çeşitli yolları vardır.
Yapabileceğimizi düşündüğümüz eylemlerin belirli bir listesini hazırlayabiliriz:
1. İşlem: Tilkiyi nehrin karşı tarafına taşıyın.
2. İşlem: Kazı nehrin karşı tarafına taşıyın.
3. İşlem: Mısır çuvalını nehrin karşı tarafına taşıyın.
Ancak, sorunu biçimsel olarak yeniden ifade etme amacının çözüm için bir fikir edinmek olduğunu unutmayın. Eğer problemi çözemediyseniz ve diğer gizli işlemleri keşfedemediyseniz eylem listesi oluştururken de problemi çözemeyiz demektir. Bunun yerine işlemleri kapsamlı (biçimsel) yapmalı ve koşullu hâle getirmeliyiz.
1. İşlem: Tekneyi bir kıyıdan diğerine götürün.
2. İşlem: Teknede yalnızca çiftçi varsa (sadece bir nesne) tekneye kıyıdan bir nesne yükleyin.
3. İşlem: Teknede iki nesne varsa (çiftçi ve bir nesne daha) nesneyi kıyıya bırakın.
Bu ikinci işlem listesi; problem hakkında en biçimsel anlamda düşünmemizi, koşullara uygun biçimde problemi çözmemizi, kaz ile yakın kıyıya geri yolculuğu düşünmemizi sağlayacaktır. Olası tüm hareket dizilerini üretirsek her bir diziyi kısıtlamalardan birini ihlal ederek veya daha önce gördüğümüz bir yapılandırmaya ulaşarak bitirirsek sonunda bulmacayı çözeriz.
Böylece bu problemi 7 adımda çözdüğümüzü görürüz.
1. İşlem: Kazı nehrin karşı tarafına taşıyın.
2. İşlem: Tekneyi bir kıyıdan diğerine götürün.
3. İşlem: Tilkiyi nehrin karşı tarafına taşıyın.
4. İşlem: Kazı nehrin karşı tarafına taşıyın.
5. İşlem: Mısır çuvalını nehrin karşı tarafına taşıyın.
6. İşlem: Tekneyi bir kıyıdan diğerine götürün.
7. İşlem: Kazı nehrin karşı tarafına taşıyın.
Bu Problemden Neler Öğrendik?
Sorunu daha biçimsel bir şekilde yeniden ifade etmek, bir problemi anlamak için mükemmel bir tekniktir. Birçok programcı, diğer programcıları bir sorunu tartışmak için arar; sadece diğer programcıların yanıtı olabileceğini düşünür fakat aynı zamanda problemi yüksek sesle ifade etmek genellikle yeni ve yararlı düşünceleri tetikler. Bir sorunun tekrar okunması, bu tartışmayı başka bir programcıya yaptırmak gibidir ancak her iki noktadan da destek alırsınız.
5.2. Sudoku
Sudoku oyunu gazete ve dergilerde yer almasıyla ayrıca web ve telefon tabanlı bir oyun olarak sunulmasıyla son derece popüler hâle gelmiştir. Farklı varyasyonlar olmakla birlikte burada kısa olan geleneksel sürümü tartışılacaktır.
9×9 boyutlu bir tablo kısmen tek basamaklı (1-9 arası) sayı ile doldurulur ve oyuncu belirli kısıtlamalara göre hareket ederken yalnızca boş kareleri doldurmalıdır: Her bir satır ve sütunda, her rakam tam olarak bir kez yazılmalıdır ve her doldurulmuş 3×3 alanda her bir rakam tam olarak bir kez yer almalıdır. O zaman, verilen bir sudoku yapısındaki boşlukları 1-9 arasındaki her bir sayıyı; bulunduğu satır, sütun ve kare içinde yalnızca bir kez kullanılacak biçimde nasıl doldururuz?
Daha önce bu oyunu oynadıysanız muhtemelen en az zamanda bir kareyi tamamlamak için bir dizi stratejiniz vardır. Şekilde gösterilen örnek kareye bakarak anahtar başlangıç stratejisine odaklanalım.
Sudoku bulmacanın zorluk derecesi doldurulması gereken karelerin sayısı ile belirlenir. Bu örnek çok kolay bir bulmacadır. 36 kare zaten doldurulmuş olduğundan, bulmacayı tamamlamak için doldurulması gereken sadece 45 kare bulunmaktadır.
Soru şudur: Hangi kareleri ilk olarak doldurmaya çalışalım?
Bulmacanın kısıtlamalarını hatırlayın. Dokuz ana karenin her bir satır ve sütunda, her rakam tam olarak bir kez yazılmalıdır ve her doldurulmuş 3×3 alanda her bir rakam tam olarak bir kez yer almalıdır. Bu kurallar, çabalarımıza nereden başlamamız gerektiğini belirtir. Bulmacanın ortasındaki 3×3 alan, dokuz kareden sekizinde zaten sayıya sahip. Bu nedenle ortadaki kare, yalnızca 3×3 alanında başka bir karede temsil edilmeyen tek bir olası değeri içerebilir. İşte bulmacayı buradan çözmeye başlamalıyız.
Bu alandaki eksik rakam 7’dir, bu nedenle orta kareye 7 rakamını yerleştireceğiz. Bu değeri yerinde yazdığımızda, bu sütunun artık dokuz kareden yedisinde değerlere sahip olduğunu ve bunların her bir sütunda bulunmayan bir değeri olması gerektiği ve yalnızca iki kareyi boş bıraktığını unutmayın: İki boş karenin değeri 3 ve 9’dur. Bu sütundaki kısıtlama her iki numarayı da her iki yere yazmamıza izin verir ancak 3’ün üçüncü satırda, 9’un zaten yedinci satırda bulunduğuna dikkat edin. Bu nedenle satır kısıtlamaları, 9’un orta sütunun üçüncü satırına, 3’ün orta sütunun yedinci satırına yazılmasını gerektirir. Bu adımlar aşağıdaki şekilde özetlenmiştir.
Tüm bulmacayı burada çözmeyeceğiz ancak bu ilk adımlar, ideal olarak mümkün olan en düşük sayıdaki kareler için aradığımız sadece bir tane önemli noktayı görmemizi sağlar.
Bu problemden neler öğrendik?
Sudokunun temel dersi, problemin en kısıtlı bölümüne bakmamız gerektiğidir. Kısıtlamalar, çoğu zaman bir problemi zorlaştıran şeyken (Tilkiyi, kazı ve mısır çuvalını unutmayın) aynı zamanda çözüm hakkındaki düşüncemizi basitleştirebilir çünkü seçenekleri ortadan kaldırır.
Yapay zekâyı bu kitapta özel olarak tartışmayacak olsak da yapay zekâda “en katı değişken” olarak adlandırılan belirli türdeki problemleri çözmek için bir kural vardır. Kısıtlamaları karşılamak için farklı değişkenlere farklı değerler atamaya çalıştığınız bir problemde, en fazla kısıtlamaları olan değişkenle başlamak ya da olası değerlerin en düşük sayısına sahip değişkeni başka bir şekilde koymak gerekir.
İşte bu tür düşünceye bir örnek; bir grup iş arkadaşınızın sizinle beraber öğle yemeğine gitmek istediğini ve herkesin beğeneceği bir restoran bulmanızı rica ettiğini varsayalım. Problem şu: Meslektaşların her biri grup kararında birtakım kısıtlamalar getiriyor; Ayşe vejetaryen, Can deniz ürünlerini sevmiyor, Serhan’ın çoklu gıda alerjisi var vb. Hedefiniz bir restoran bulmak için gereken süreyi en aza indirmek ise en sıkı kısıtlamalara sahip olan iş arkadaşınızla konuşarak başlayın. Örneğin Serhan’ın bir dizi geniş gıda alerjisi varsa Can’dan başlamak yerine, Serhan’ın yiyebileceği yemeklerin olduğu bir restoran listesi bularak başlamak daha mantıklı olacaktır. Deniz ürünlerinden hoşlanmaması daha kolay çözülebilir.
Aynı teknik, genellikle programlama problemlerine uygulanabilir. Sorunun bir kısmı aşırı derecede kısıtlıysa bu, başlamak için harika bir yer çünkü daha sonradan çözülecekse iş yerinde boşa vakit geçirdiğinizi düşünmeden ilerleme kaydedebilirsiniz. Bununla ilgili bir sonuç, belirgin olan kısmı ile başlanması gerektiğidir. Sorunun bir bölümünü çözebilirseniz devam edin ve mümkün olanı yapın. Kendi kodunuzu görmek, gerisini çözmek hayal gücünüzü artıracak ve bundan bir şeyler öğrenebileceksiniz.
5.3. Dikdörtgeni Parçalara Ayırma
Bir dikdörtgenden nasıl dik üçgenler oluşturabiliriz? Buna göre, bir dikdörtgeni bölerek, oluşturulabilecek dik üçgenleri şekil çizerek gösteriniz.
Bir dikdörtgenin kısa kenarı 1 cm olduğunda uzun kenarının 1 cm’den büyük olması gerekmektedir. Uzun kenar 2 cm olduğunda A-1 şeklinde gösterilen dik üçgenler elde edilir. Oluşan dik üçgenlerden her birini de A-2 şeklinde dik üçgenlere ayırabiliriz.
İkinci çözüm yolu ise B-1 şeklindeki gibi dikdörtgen içerisinde birbirine paralel çizgiler oluşturmaktır. Oluşan küçük üçgenleri de B-2 şeklinde gösterilen biçimde dik üçgen olacak şekilde bölebiliriz.
Bu problemden neler öğrendik?
İlk çözümde aşağıdan yukarıya adım adım yapılan bir strateji kullanılmıştır. İkinci çözümde ise dikdörtgen farklı üçgenlere çevrilmiş ve elde edilen üçgenlerden tekrar dik üçgen elde edilmiştir.
5.4. Engelli Yollar
Şekilde gösterilen A noktasından B noktasına gidebilmek için gri ile gösterilen alandan geçiş bulunmamaktadır. Buna göre A’dan B’ye gidebilmek için kaç farklı yol kullanılabilir? Doğru cevap 17’dir. Sorunun çözümünde satır ve sütunların kesişim noktalarından yararlanılmıştır. Şekilde görüldüğü gibi 1. satır 1. sütundan başlanarak satır satır işlem yapılır ve her kesişim noktasında soldaki ve üstteki değerler toplanır. Kesişim noktasının üstünde ya da solunda değer yoksa aynı sayı tekrar yazılır. Örneğin 1. satır 1. sütundaki değer 1’dir. 1. satır 2. sütuna geçildiğinde sadece sol tarafta 1 değeri olduğu için 1 yazılır. 2. satır 2. sütunda ise kesişim noktasının solunda ve üstünde 1 değeri vardır. Bu nedenle bu kesişim noktasının değeri 1+1=2 olur. En son 5. sütun 4. satıra gelindiğinde ise 9+8=17 olur.
Bu problemden neler öğrendik?
Yol hesaplama, çok iyi bilinen dinamik programlama uygulamalarından biridir.
5.5. Hanoi Kulesi
Yukarıdaki şekilde çeşitli renklerle gösterilen tahta parçaları, A çivisinden C çivisine aşağıdaki kurallara göre geçirilmek istenmektedir.
Küçük tahtaların üstüne büyük tahtalar yerleştirilemez.
Aynı anda sadece bir disk oynatılabilir.
Buna göre tahta parçalarını A’dan C’ye taşıyınız. Bu soruda 5 tahta parçasının C çivisine taşınması gerekmektedir. Sorunun çözümü aşağıdaki gibidir.