Son Dakika: HÖSYM İş Görüşmelerinde Çıkan Soruları Çaldırdı

Share Button

HÖSYM, sonunda bu da oldu dedirtecek cinsten bir olaya daha imza atarak iş görüşmelerinde çıkan soruları da çaldırdı. Konuyla ilgili olarak HÖSYM başkanı Gani Hemir sessiliğini korurken tevekkülden sorumlu kısmi eğitim bakanı Süleyman Çekik “Allahın taktdiri, biz ne yapabiliriz ki ?.” şeklinde açıklamada bulundu. Olayla ilgili savuşturma başlatıldı.

***

İş görüşmelerinde, görüşme yaptığınız teknik insanlar sizi koklayarak tanıyamayacağından mütevellit stres altında neler yapabildiğinizi görebilmek adına çeşitli matematik teorilerini programatik ortamda modellemenizi isteyebilirler. Burada genel olarak ilk bakılan şey yazdığınız kodun neye benzediği, sonrasında ise kullandığınız metodolojidir. Eğer yapmanız gereken iş iteratif bir davranış içinde olacaksa ve siz bunun için iç içe döngüler yazmayı düşünüyorsanız derhal ellerinizi klavyeden kaldırın! Bunu yazmak yerine “Bu böyle yapılabilir ama, daha performanslı bir metod şu an heyecandan aklıma gelmiyor.” gibi bir cümle belki tarihi bir fırsatı kaçırmanızın önüne geçebilir. :)

Bugün sizlerle twitterda bir arkadaşımın gönderisi üzerine aklıma gelen fibonacci, faktöryel ve mükemmel sayılar teorileriyle ilgili olarak bir iki küçük örnek paylaşmak istiyorum.

Mükemmel Sayılar (Perfect Numbers) Nedir ?

Mükemmel sayılar kendisi hariç pozitif tam sayı bölenlerinin toplamına yada tüm pozitif tam sayı bölenlerinin toplamının yarısına eşit olan sayılardır.

Örnek:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

Bir Sayının Mükemmel Sayı Olduğunu Nasıl Doğrularız ?

function isPerfectNumber($value)
{
  $total = 0;
  for( $i = 1; $i < $value; $i++ ) {
    if($value % $i == 0) {
      $total += $i;
    }
    echo sprintf('Value: %s, Loop: %s, Total: %s', $value, $i, $total) . PHP_EOL;
  }
  return $value == $total;
}

if( isPerfectNumber(8128) ) {
  echo 'This is a perfect number' https://twitter.com/i/connect. PHP_EOL;
 } else {
  echo 'This is not a perfect number.' . PHP_EOL;
 }

Sonuç:

Value: 8128, Loop: 1, Total: 1
Value: 8128, Loop: 2, Total: 3
Value: 8128, Loop: 3, Total: 3
Value: 8128, Loop: 4, Total: 7
Value: 8128, Loop: 5, Total: 7
...
alue: 8128, Loop: 8123, Total: 8128
Value: 8128, Loop: 8124, Total: 8128
Value: 8128, Loop: 8125, Total: 8128
Value: 8128, Loop: 8126, Total: 8128
Value: 8128, Loop: 8127, Total: 8128
This is a perfect number

real	0m0.629s
user	0m0.124s
sys	0m0.060s

Bu değil, daha farklı birşey olmalı. Bunu herkes yapıyor… Daha az kaynak tüketmeli, cpu/memory mutlu olmalı.

Peki, o zaman gelin bir de tail call optimizasyonu ile recursive olarak yapmayı deneylim.

function isPerfectNumber($value, $divisor = 1, $acumulator = 0)
{
  echo sprintf('Value: %s, Recursion: %s, Acumulator: %s',
              $value, $divisor, $acumulator) . PHP_EOL;

  if( $divisor < ($value -1) &&  $acumulator != $value / 2) {
    $acumulator = ($value % $divisor == 0) ? $acumulator + $divisor : $acumulator;
    return isPerfectNumber($value, $divisor+1, $acumulator);
  } else {
    return $acumulator == $value / 2;
  }
}

if( isPerfectNumber(8128) ) {
  echo 'This is a perfect number' . PHP_EOL;
 } else {
  echo 'This is not a perfect number.' . PHP_EOL;
 }

Sonuç:

Value: 8128, Recursion: 1, Acumulator: 0
Value: 8128, Recursion: 2, Acumulator: 1
Value: 8128, Recursion: 3, Acumulator: 3
Value: 8128, Recursion: 4, Acumulator: 3
Value: 8128, Recursion: 5, Acumulator: 7
...
alue: 8128, Recursion: 2029, Acumulator: 2032
Value: 8128, Recursion: 2030, Acumulator: 2032
Value: 8128, Recursion: 2031, Acumulator: 2032
Value: 8128, Recursion: 2032, Acumulator: 2032
Value: 8128, Recursion: 2033, Acumulator: 4064
This is a perfect number

real	0m0.229s
user	0m0.044s
sys	0m0.016s

Euclid çalışmış, didinmiş şöyle birşey bulmuş:
2p−1(2p−1).

function isPerfectNumber($value,$power = 2)
{
  echo sprintf('Value: %s, Recursion: %s', $value, $power-1) . PHP_EOL;
  if( pow(2, $power-1) * (pow(2, $power) -1) == $value && $power < $value) {
    return true;
  } else {
    return isPerfectNumber($value, $power + 1);
  }
}

if( isPerfectNumber(8128) ) {
  echo 'This is a perfect number' . PHP_EOL;
 } else {
  echo 'This is not a perfect number.' . PHP_EOL;
 }

Sonuç:

Value: 8128, Recursion: 1
Value: 8128, Recursion: 2
Value: 8128, Recursion: 3
Value: 8128, Recursion: 4
Value: 8128, Recursion: 5
Value: 8128, Recursion: 6
This is a perfect number

real	0m0.062s
user	0m0.048s
sys	0m0.016s

Gördüğünüz üzere ilk denememizde 8127, ikincide 2033 ve son denememizde 6 iterasyonda bu işi tamamldık.

Bir sonraki yazıda fibonacci ve factorial konularını ele alacağız.

Kaynaklar:
http://en.wikipedia.org/wiki/Perfect_number
http://www.bilgisayarkavramlari.com/2008/08/12/kuyruk-ozyinelemesi-tail-recursion-birikimsel-tarz-accumulation-style/
http://c2.com/cgi/wiki?TailRecursion

Share Button

About İbrahim Gündüz

1983 yılında İstanbul’da doğdu. İlkokul yıllarında cobol ve basic le olan tanışması, yazılıma olan ilgisini arttırdı 2005 yılında. Uludağ Üniversitesi Teknik Bilimler Meslek Yüksek Okulu Elektronik bölümünden mezun olan Gündüz, çeşitli alanlarda faaliyet gösteren kurumlarda yazılım geliştirici olarak görev almıştır. Mesleki ilgi alanları, ölçeklenebilir sistemler, uygulama entegrasyonları ve ödeme sistemleridir. Halen Markafoni back end geliştirici olarak çalışmaktadır.

2 Comments

  • Kasım 6, 2012 - 6:58 pm | Permalink

    İbrahim İşe alış sorularımızı bu şekilde açıklaman hiç hoş olmamış. :)

    Maalesef yine bir hata düzelterek başlayacağım. Euclid’in formülü (p) yerine sadece belirli asal sayılar koyulduğunda geçerli oluyor. (Örnek olarak p=11 için çıkan sayı altın/mükemmel sayı değil)

    Sınav anında da oturup bu asal sayıları bir diziye yazamayacağın için 6 loop ile mükemmel sayı doğrulamak olasılık dahilinde görünmüyor.

    Bu konuya örnek olarak, benzer bir mülakattan sonra benim geliştirdiğim fonksiyona http://www.goktugozturk.com.tr/programlama/perfect-golden-number/ adresinden ulaşabilirsin.

    • Kasım 7, 2012 - 7:57 am | Permalink

      Haklısın. Aslında wikide de p nin asal sayı olması gerektiğini yazmış yazar. Ben atlamışım :) 40 çift mükemmel sayı için p aşağıdakilerden biri olmalıymış.
      2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941, 11213, 19937, 21701, 23209, 44497, 86243, 110503, 132049, 216091, 756839, 859433, 1257787, 1398269, 2976221, 3021377, 6972593, 13466917, 20996011, 24036583, 25964951, 30402457, 32582657, 37156667, 42643801, 43112609. Bu arada senin blogdaki mantık hakikaten başarılı.

      Tekzip yayınlayacağım :))

  • Bir Cevap Yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir