|
go ile bunu yazdırmak saniye sürmüyor. consola yazdırmak dahil yaklaşık 200 ms başlangıç zamanı : 2019-10-07 10:38:40.0176805 bitiş zamanı : 2019-10-07 10:38:40.2355538 kodu ben yazmadım. internetden hazır buldum. recursive fonksiyon kullanarak yapılmış. ancak recursive fonksiyon lar go da tavsiye edilmiyor. Iterative versiyonu yapılırsa daha da hızlanabilir |
Kodu çalıştırma hızı değil, 1-10 arası sayıların faktöryelini hesaplayan kod ne kadar pratik, bu önemli. Ayrıca diyelim ki hız Go ile 200ms, C++ ile 100ms çıktı bunun önemi yok cunku önemli olan bu kodların makina koduna derlenmesi yani arada JRE veya CLR gibi ara işleyici gerekmemesi. Düşünsen ürettiğin exeyi biri bilgisayarında direkt çalıştırabilecek. Raku (eski adıyla Perl 6) ve Java 8'de ürettiğim kodu herkes direkt çalıştıramaz. |
1-10 arası faktöryel hesaplamaya için cevap vermedim. 1 milyonuncu Fibonacci için cevap verdim. kod kısa değil. go burada consola yazmada sorun çıkarmadığı için bilgilendirmek istedim. |
Kodun kendisini görmeden sadece yorumu görünce 1-10 arası faktöryel sorusu üzerine yorum sandım. 1-10 arası sayıları, yerleşik math , faktöryel işlevi kullanmadan, fonsiyonel olarak faktöryelini hesaplayan C++17 kodu. 9 satır ve cok kasmadan 9 satır. Şimdi aynı işlemi Go ile yap, kod gönder inceleyelim ve karşılaştıralım: < Resime gitmek için tıklayın > |
go ile sadece 5 satır, kodu online test etmek için link https://play.golang.org/p/GnnzSvQXRHO < Resime gitmek için tıklayın > |
klasik for döngüleri kullanarak yapılacaksa C++'ta 3 satır :) < Resime gitmek için tıklayın > Klasik for döngüsü ile yapılamayacak ve fonksiyonel programlamayı zorlayacak bir soru düşüneyim şimdi... Bu arada benim bilgisayarda Go compiler var; online compiler kullanmama gerek yok. |
sort veya is_sorted gibi yerleşik fonksiyon kullanmadan şu serilerin elemanlarının artan ve sadece artan (eşit rakamlar artan sayılmayacak) olduğunu kontrol eden kod yazınız. C++ ile 14 satırda yazdım. Perl 6 ile 2 satır, biraz kasarsam belki tek satırda yazabilirim.
|
a=input().split(",") c=1 for i in range(len(a)-2): c=[c,0][int(a[i ])>=int(a[i+1])] print(c) python pek kullanmam anca bu kadar. |
Kodu denedim fakat ufak bir eksiği var: 1,2,3,3 serisini artan olarak degerlendirdi. artan seri deki şartımız önceki eleman < sonraki eleman yani şart < olmalı =< değil. C++'daki 'is_sorted' fonksiyonu da örneğin =< ile çalışıyor yani o fonksiyon da işe yaramaz. Bu işi Raku'da (eski adıyla Perl 6) tek satırda yapabiliyorsun: < Resime gitmek için tıklayın > say [<] prompt("Seri gir: ").split(" "); Kodun açıklaması: sağdaki prompt("Seri gir: ").split(" ") Python'daki input().split(" ") ile aynı işi yapıyor yani kullanıcının girdiği seriyi tutuyor. onun solundaki [<] ise 2 operatörün birleşimi [ ] indirgeme operatörü ve içine aldığı < ise indirgeme şartını ileten operatör ve bu operatör kombinasyonu seri boyunca elemanları < ile karşılaştırarak sonucu iletiyor. Fakat bu [ ] operatörünün bir özelliği daha var: Matematikte "birleşme özelliği" vardır. Bu operatör, zincirleme birleşme özelliğine (chaining-associativity) default olarak sahip oyüzden seri boyunca < kontrolünde sadece 1 eleman uymasa tüm işlem negatif veriyor. Default zincirleme birleşme özelliğ yerine, soldan birleşme özelliğ de atayabilirsin. Veya içerdeki operatörü < değil de <= yapabilrsin ki o durumda senin Python kodu ile aynı sekilde sonuç verir. |
inputta sonda ',' koyulan case icin yaptim. 1,2,3,3, de 0 veriyor sonda ',' yoksa son sayiyi saymiyor. perldeki mantikla 2 satira indirdim, cirkin oldu ama ![]() a=input().split(",") print(not(False in [a[k]<a[k+1] for k in range(len(a)-2)])) sonraki donem perl dersi var. bakalim bu trickleri gorecek miyiz. |
Çıktı verirken sonda virgül olabilir fakat veri girişnde olması için pek rastlanan şey değil. Sona da virgül koyunca doğru calıştı. 2 satırlık versiyon o kadar kötü sayılmaz. Üniversitede Perl dersinde bu trick'leri göstereceklerini pek sanmam. Ayrıca Raku gösterileceğini de pek sanmam, bahsettikleri ders Perl 5'tir. |
bunu nerede ve ne için kullanacağınız öğrene bilir miyim !? |
Konunun kağıt üstündeki amacı soruları en pratik kod ile çözmek Fakat asıl amacı programlamcılık becerilerini geliştirmek. Unutulan bazı programcılık yöntemlerini hatırlamak. Dolayısıyla soruların gerçek hayatta kullanılması şart değil. |
basit kod yazmak denince akla api gelir konu orada biter gider. programlamayı geliştirmek diyorsanız asm seviyesine inilmesi daha mantıklı olur ! ne kadar çok kod o kadar çok kontrol anlamına gelir. amaç eğer performans ise ! |
Amaç performans değil, daha doğrusu No.1 öncelikli değil, amaç basit fakat (cogu kez) temel matematik gerektiren soruları kısa ve net kod ile çözmek. Örnein sort fonksiyonu kullanmadan artan seriyi kontrol etmek sorusunu kısa ve net kodlayabiliyor musun? Soru budur. Bu veya önceki diger soruları önce kod ile yanıtlayamıyorsan yoruma gerek yok. |
matematik & mantık diye bir programı dili olsa inan ki dünyanın en verimli programlama dili bu olurdu. mantık konusunda eşleştirme yöneticileri zaten klasik bunda sorun yok matematik noktasında da aslında sıkıntı yok 4 fonksiyonla bütün işler yapıyor + - x / sorun şu ki bu dille her şeyi tanımlayabilmek varken. fonksiyonlu dillerin fonksiyon terimleri amaçı hep unutturuyor. keşke yeni bir programlama dili yazsanız ! işte burada verdiğiniz emeğe değer. |
Konumuz temel / orta düzeyde programlama sorularını en kısa şekilde çözmek ki buradaki amaç yeni fonksiyonel programlama tekniklerini kullanmak. Go'da bu teknikler ne kadar kullanılıyor, önemli olan bu. C++17 'ye örneğin yeni fonksiyonel özellikler eklenmiş, kullanılıyor, o sayede örneğin 1'den 10'a kadar sayıların faktöryelini C++17 ile hazır factorial fonksiyonu kullanmadan cok satır tutmayacak şekilde kodlayabilirim.
< Bu ileti mini sürüm kullanılarak atıldı > Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesajda bahsedilenler: @FatihAsl