< Resime gitmek için tıklayın > Fibonacci genel teriminde N yerine 1 milyon yazınca çıkar. —— 2 elemanlı bir queue( tek yönlü olandan, dequeue olmayan dı galiba) oluşturalım 1 1 olsun Sonra for döndürüp 1 milyon kere{ İçindeki ikisini topla queue ye ekle Sonra diğer kenardaki elemanı çıkart } Böylece queue muz 1,1 1,2 2,3 3,5 5,8 ... gibi oldu 1 milyonu da bulunca yazdırırız Buna dynamic programming deniyor galiba, dinamik programala nedir diye 1-2 örnek bakmıştım Map, tablo falan kullanıyordu. —— Recursion ile de yapılabilir F(n)=f(n-1)+f(n-2) gibi Bunlarda javada depth hatası verir gibi, ama başka özel yolu vardır belki |
O formülü hatırladım fakat o fibonacci sayısını yaklaşık olarak hesaplıyor diye biliyorum yani tam degeri vermiyor. Tam değeri bulmak için optimize edilmiş rekürsif fonksiyon en hızlı yol. Ancak sonuç 1 milyonuncu fibonacci sayısı 208988 rakam uzunluğunda olduğu için sadece optimizasyon da yeterli değil, dev rakamları tutacak compiler veya C# için BigInt gibi kütüphane gerekli. SBCL (Steel Bank Common Lisp) compiler dev rakamları tutabildiği için onu kullandım 30sn gibi sürde buldu. Şu an başında olduğum bilgisayarda SBCL ile eşdeğer fakat biraz daha düşük performanslu CMUCL (Carneige Mellon University Common Lisp) derleyici var ve 32bit o yüzden sanırım 1dk dan fazla sürdü (yine tam ölçmedim 20-30sn sonra bilgisayarın başından kalktım birkaç dk sonra döndüğümde hesaplamıştı) < Resime gitmek için tıklayın > Emacs editörün durum çubuğundaki Bot (?? 208988) sonucun karakter sayısını gösteriyor yani 1 Milyonuncu Fibonacci 208988 rakam uzunluğunda. Senin formuldeki (1+kök 5) / 2 altın oran rakamı bu arada. fibonacci dizisi ile altın oran arasında matematiksel ilişki var. |
bu işlerde makine gücü de önemlidir ama bendeki makine de 15 saniye civarı hesaplıyor en kısa kod işine bakmıyorum tabi
|
Evet 15 sn sürüyor fakat fibonacci sayısının sadece uzunluğunu ilettiği için. Sayının kendisini konsola yazdırması (ToString().Length'i kaldırarak) dakikalar sürdü ve bir hata ile sonlandı: < Resime gitmek için tıklayın > Sayının kendisini yazdırmak bu soruya dahil. |
Bende console a yazdırma da bir problem çıkmadı süresi de aynı |
bu sorularda matrix exponentiation kullanilir ki soyle: |1 1| * |F1 0| = |F2 0| |1 0| * |F0 0| = |F1 0| |1 1| n |F1 0| = |Fn+1 0| |1 0| * |F0 0| = |Fn 0| (ilk matrisin n inci kuvvetini aliyoruz ilk matrisimiz ile carpiyoruz) bu yontemde matrisin n. kuvvetini hesaplamak icin fast exponentiation kullanilir. ornek python kodu burada(kodu ben yazmadim ornege uysun diye sayilari degistim sadece ):
|
Matriks ile üs hesaplama kodu biraz karışık. Ve o kod milyonuncu fibonacci yi ne kadar sürede hesaplar o da belli değil. Benim kod en kısa ve C# tan sonra en hızlı. Aşağıdaki milyonuncu fibonacciyi hesaplama süresini ölçtüm, yaklaşık 50sn. @Gökşen PASLI C# BigInt modülünü cok iyi yazmışlar, yüzbinlerce rakam uzunluğunda Int 'i bile sorunsuz hesaplıyor. Fakat senin kodu mono-4.2.1 kurulu Mac OS X'te denerken error CS0234: The type or namespace name `Console' does not exist in the namespace `System'. Are you missing an assembly reference? hatası verdi. Kullandığım build dosyası:
Oradaki System.Numerics.dll 'i sorunsuz kullanıyor, ardından gelen 3 System.xxx.dll'i ben ekledim, Console 'u bulur diye, bulamadı. mono-4.2.1'de Console desteği yok gibi. İlginç bir eksiklik. O çalışsaydı, Mac'te senin kodu deneyebilecektim. < Resime gitmek için tıklayın > |
attigim kod pythonda 5 snde calisiyor ayni algoyi c++da yazsak 1 sn altina duser bence ama daha cirkin bir kod olur |
@FatihAsl https://forum.donanimhaber.com/link-139633625 'deki maaş artış hesapla problemi
Perl 6 ile tek satırda çözümü (forumdaki code etiketi kodu bozdugu için SS gönderdim) < Resime gitmek için tıklayın > |
maalesef bu tek satır değil |
Perl 6'da satır ayrımı ; ile yapılır. Hiçbir ; olmayan bir kod nasıl tek satır olmuyor onu merak ettim şimdi ::) |
|
Kodu tek satır iddiasıyla yazdığım için pek okunaklı değil. 2 veya 3 satıra yaysam Perl6 bilmeyen biri için dahi oldukça okunaklı olabilir fakat o zaman tek satır iddiası gerçekleşmemiş olur. Fakat buradaki asıl konu zaten, kodu tek satırda yazmaya calışırken dilin değişik özelliklerini öğrenmek. |
edit: ben ekleyim bari. işte tek satır denen şey aslında aşağıdaki gibi
buda golang kodu
kodlar bozulduğu için buda goland ide ekran görüntüsü < Resime gitmek için tıklayın > golang in C++ dan daha pratik olduğuna itiraz edenler lütfen bu örneği C++ ile yapabilir mi? |
Süslü parantezleri yeni satırlara yayarak satır sayısı belirlenmez. Süslü parantezin tek amacı kod bloğunu görünür kılmaktır ve başladığı satıra ait syntax olarak kabul edilir yani süslü parantez içindeki kod bloğu, başladığı satıra aittir. O yüzden gönderdiğim Perl 6 kodu tek satır. İç içe geçmiş bloklar birbirine bağımlı tek satır. Ona bakarsan senin GOnzalez kodunda da bir satırlık ifadede 8 süslü parantez var, onları finput := [][]string { { "Maaş Listesi :", "" }, { "Oran Listesi :", "" }, { "Para Birimi :", "" } } şeklinde yeni satırlara yayarak 11 satır, tüm program ise 31 satır sayılır :) C++'da bu programı 14 satırda yaptım, GOnzalez ile kafa kafaya. Kodları göndermedim cunku Perl 6'da tek satırda yaptım zaten. GOnzalez 'de 19 satırda yaptığın şeyi 1 satırda hallettim. GOnzalez C++ dan daha az pratik demedim, sadece C++ varken GOnzalez gereksiz dedim yoksa pratiklik açısından GOnzalezle C++ kafa kafaya fakat tabi ki C++ GOnzalezle karşılaştırılamayacak kadar yaygın. OS'ler, sistem programları C++ ile yapılıyor. Mac'te sürücü yazacaksın diyelim, C++ kullanıyorsun. GNOME, KDE gibi masaüstü ortamları da C++ ile geliştiriliyor. GNOME un geliştiricileri aa GOnzalez diye bir dil çıkmış, C++'yi bırakıp artık GOnzalez kullanım demiyorlar cunku onu gerektirecek bir durum yok. Sistem programlarını geç, işletme & finans yazılımlarında yine C++ ve Python, Java, Scala ve Clojure kullanılıyor. Wall Street'te finans işlemleri için C++ ve Clojure kullanan adamlar aa GOnzalez cıkmış GOnzalez kullanalım demeyecekler. Web frameworklerde de PHP ve ES6'ya ek olarak Ruby ve Python yaygın. Web backend geliştiricileri aa hızlı GOnzalez cıkmış dur şu Ruby Rails framwork 'ü bırakayım demez cunku artık Ruby bile oldukça hızlı. Perl 6 JVM'de calışabiliyor, ona göre tasarlandı. JVM 'de calışmak demek hız demek. Gelişmiş bir web uygulaması yapacak kişi GOnzalez hızlı diye kulanmaz cunku artık hepsi hızlı.Bu durumda Gonzalezle 19 satırda kodlanabilen şeyi 1 satırda kodlama imkanı sağlayan Perl 6'ya sıcak bakar. Hadi Perl 6 biraz yabancı kalıyor diyelim, Ruby , Python falan kullanır, web için yine GOnzalez'i kullanmaz. Hiçbir özelliği olmayan fuzuli bir dil. |
linkini veriyorum adamlar Perl den Go ya geçmişler. gerçek dünya çok farklı https://medium.com/@alvintz.v/how-we-migrate-from-perl-to-golang-1520a4951392 |
Benim kullandığım Perl değil, Perl 6. Bazen Perl kullandığım da oluyor fakat yukarda gördüğün tüm 'tek satır' kodlar hep Perl 6. İkisi arasında cok fark var. Perl 1987'de çıkmış, Perl 6 ise 2015'te piyasaya cıkmış (düzgün çalışan compiler olarak) Linkteki kişiler Perl 6 nedir bilmiyorlar, denize düşmüşler GOnzalez'e sarılmışlar :) |
|
Maaş oran hesapla programının daha okunaklı versiyonu. 3 satır:
$ perl6.exe maas-oran-hesapla_uzun.pl Maaş Listesi, Artış Listesi, Para Birimi gir: 2200 3400 5500, 1.25 1.1 1, TL 2200 yeni 2750.00 TL 3400 yeni 3740.00 TL 5500 yeni 5500.00 TL |
4 satırlık kod ile yaklaşık 20sn'de buldum. Sayının uzunluğu 208988 basamak!
Not1: Cok büyük rakamları tutabilen SBCL derleyici kullandım
Not2: 1 Milyonuncu fibonacci sayısının uzunluğunu program kodu ile değil, editörden ölçerek buldum.