Konu eski ve çözülmüş bir durum ama üzerinde konuşmaya değer.
Özellikle bu kısım zaten hoşuma gidip üzerinde konuşmaya değer bulduğum kısım.
Farklı dillerin eski versiyonlarını bilen dil sınıflandırma yaklaşımlarının bir kaçına bakan biri için aslında anlaşılabilir bir durum.
C/C++, Pascal gibi dillerde kod satır şeklinde işlenmez. Bloklar halinde işlenir yanı bloğun başlangıcını ve bitişini koda ayrıca bildirmeliyiz.
Mesela bunu c de { }
küme parantezleri ile yaparız. Blok nerede başlar bildirir sonra nerede biter onu da ayrıca bildiririz. Bu parantezler olmadığında kod çalışmaz kodun nerede başlayıp bittiğini anlayamaz. Bu da yetmez bir kaç bloktan oluşan kod da oluşturabilir bir de komple kodu bitireyim diye sonuna ;
noktalı virgül bildirimi ister mesela if
koşullu karşılaştırmasında hem bloğu hemde else bağlantılarını ayrıca bildirmek ve else lerin bittiğini de ayrıca noktalı virgülle bildirmek gerekir.
Pascal bu işe daha da ilginç yaklaşır. Madem başlangıç ve bitiş bildireceğim ve yüksek seviye dilim o zaman begin
ve end
bildirimleri arasında yazalım blokları buradan anlarız gibi yaklaşım getiriyor kodun yarısı begin end lerle dolu oluyor.
Basic ve python gibi yorumlanan diller önden bir compile edilmeyeceği için (aslında belleğe yerleştirirken bir precompile durumu var ama konumuz bu değil) satır satır alıp işler. Yani beklenti satırlar içerisindedir ve bir sonraki satırda olup biteceklerin icabına sonra bakarız yaklaşımı vardır. Tabi kapsam/scope durumu biraz yanıltıcı olabilir sadece o satıra indiğinde anlamlı olarak faydalanılır ama önden o scope için pek ön almaz (optimizasyon da konumuz dışı o konuda da istisnalar var)
Bu durumda pyrhon içinde anahtar kelimeleriniz bloklanmadığından kapsamı nereye bağladığınız biraz kendi sorumluluğunuzda kalıyor bu nedenle şaşırmamak gerekir.
Ha madem başlığa girdik biraz faydası olsun kod konusunda da bir iki çift kelam edelim.
Bu asal sayı kodları neden öğrencilere öğretiliyor diye merak ediyorum açıkcası. Yani hani kriptografide asal sayı içeren fonksiyonlar aranan özelliktir, ne kadar büyük ve iyi bir asal sayınız varsa kriptografiniz o kadar geri döndürülemez şekilde olur mantığını anlarım.
Ama zaten böyle bir şeyle uğraşan çok az kişi vardır ve zaten bunlar da ilk bin asal sayı ile ilgilenmezler bile. Onlar bulabildiikleri en büyük asalsayının peşindelerdir.
Konumuz öğrenci ise hadi çocuklar asal sayı nedir biliyorlardır. Madem bildikleri bir konu Bunun üzerinde uygulama yaptırırsak programlamanın ne faydası var yada nasıl yapılır güzel bir egzersiz olabilir diye düşünülüyor herhalde.
Sonuçta, for, if döngüsü çalıştırmak için bildikleri bir konunun kuralları üzerinden yürümek faydalı olabilir. Belki (?!)
Bir bilgisayarın en iyi yaptığı işin iterasyon olduğunu düşünürsek tekrarlayan işleri yaptırmaya çalışmak ve bunu koşullara göre tekrarlatmak evet mantlıklı.
Yani eğitim amaçlı bir enstrüman olmuş asal sayılar.
Bu nedenle insanlık için küçük ama öğrenciler için büyük bir konu olmuş.
Olaya yeni bir yaklaşım getirmek adına şunu söyleyebilirim, evet bilgisayarlara tekrarlanan işlemler yaptırmak iyidir ama bu demek değildir ki olaya matematiksel olarak da bakılmasın.
Öğretim amaçlı kısımda tamam onlar dümdüz devam etsinler ama normal bir programcı olarak her zaman sınırlar olmalıdır. Ekonomi gibi, sonsuz isteklerle sınırlı kaynakların denkleştirilmesi ekonominin tanımıdır (Üretim planlama hocamın da kulakları çınlasın.)
Bu durumda malın zaman faydası, malın yer faydası gibi konulara da giresim var da neyse.
Yani her zaman gerçek dünyada size yeterli bellek, yeterli zaman verilmiyor olabilir. Bu durumda bazan düşündüğünüz gibi dümdüz gidemeyebiliyorsunuz.
Koşulları değiştirelim. Bellek sıkıntımız yok, zaman sıkıntımız var ne yaparız? Algoritmamızın en az iterasyonla yada en az koşulla bu işi yapmasını istesek neler yapabiliriz?
Gerçi python kullanan birinin bellek ve zaman kaygısı olmalımıdır o da ayrı bir konu.
Ama oldu ya kafa yorduk diyelim.
Olaya bu yöndem bakmak istedim. Şöyle ufak bir internet taraması.
Ve farklı bir yaklaşım buldum.
Tabi ki daha iyileri de araştırlabilir konu bellek olduğunda farklı yaklaşım gerekebilir ama biz iterasyon azaltabilir miyiz diye bakıyoruz varsayalım.
Şimdi bunu da lambda tek satıra da yazarız da üzerinde konuşulabilsin diye insan kodu olarak bırakmaya karar verdim:
import math
def is_prime(n):
for i in range(2,int(math.sqrt(n))+1):
if (n%i) == 0:
return False
return True
Kaynak: How to Check if a Number is Prime in Python - Geekflare
Neden böyle bir şey yapmış?
Onu da kaynakta grafiklerle açıklamış.
Tabi sizin öğrenciler bununla uğraşsın diye yazmadım bunları ama bir kod varsa kodun amacı da olmalı. Öğrenciler için koşul ve iterasyon egzersizi, programcılar ve matematikçiler için de asal sayı ve matematik egzersizi olarak bakmak gerekir diye düşünüyorum.
Kolay gelsin.
Bu arada kod üzerinde tartışabiliriz. Sizce yaklaşım mantıklı ?