İnternette baktım örnekler çok karışıktı,bende onlara oranla daha anlaşılır bir kod yazmak istedim,hazır da ödevimizken
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package ekok;
/** * * @author Che12 */ public class Ekok { // 12 ve 18 in ekokunu bul /** * @param args the command line arguments */ public static void main(String[] args) { int a = 2; int b = 14;
int tutucub = b; int tutucua = a; int sayac1 = 2;int sayac2 = 2;
int ekok = 0;
// burada büyük ve kücükleri buluyoruz sadece if(a==b) { ekok = a; } else {
İsteyen klavyeden de okutturabilir kodu biraz değiştirerek.
Algoritma ilk etapta 2 omurgaya sahip, ya iki sayı eşittir,ya da değildir. İki sayı birbirine eşit olmayınca tekrar 2 omurga açılıyor,her omurganın içinde gerekli ifadelerle algoritmamız kuruluyor
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.
'''verilen n sayida sayinin ebob ve ekoklarini oklid algoritmasini kullanarak bulur'''
from functools import reduce
def ebob(a, b) -> int: '''a ve b'nin en buyuk ortak katini dondur''' while b > 0: a, b = b, a % b return int(a)
def ekok(*args) -> int: '''verilen sayilarin en kucuk ortak katini dondur''' formul = lambda a, b: (a * b) / ebob(a, b) return int(reduce(formul, args))
if __name__ == '__main__': print(ekok(1, 2, 3))
ayrica docstring'i doldursaniza abi neden doldurmuyorsunuz onlari
'''verilen n sayida sayinin ebob ve ekoklarini oklid algoritmasini kullanarak bulur'''
from functools import reduce
def ebob(a, b) -> int: '''a ve b'nin en buyuk ortak katini dondur''' while b > 0: a, b = b, a % b return int(a)
def ekok(*args) -> int: '''verilen sayilarin en kucuk ortak katini dondur''' formul = lambda a, b: (a * b) / ebob(a, b) return int(reduce(formul, args))
if __name__ == '__main__': print(ekok(1, 2, 3))
ayrica docstring'i doldursaniza abi neden doldurmuyorsunuz onlari
Pek sevmediğim şu Python la ilg birkaç sorum olacaktı, yardımcı olursan sevinirim:
1- fonk tanımı sonrası -> int dönen değer tipi ifade ediyor olmalı ancak dönen değer zaten rakam üstüne int olacak diye belirtmenin gerekliliği nedir?
2- args önündeki asterisk sembolü anlamı nedir? Tahminen değişken sayıda argümanı ifade ediyor olmalı cunku ekok ta değişken sayıda girdi olmalı.
3- sondaki __name__ neye ait? Kodu denerken mi kullanılıyor?
------ Bunların dışında bugün rastladığım bir şey daha var:
Java ile Oklit algoritmasi kullanilarak anlasilabilir ve kisa bir sekilde yazilabilir bu algoritma. 2 parametre aliyor ama daha da genisletilebilir.
private long gcd(long a , long b){ if(a==0 || b == 0) return a + b; return gcd(b,a%b); }
private long gcm(long a, long b){ if(a == 0 || b == 0 ) throw new IllegalArgumentException("a and b can't be zero"); long gcd = gcd(a,b); return a/gcd * b/gcd * gcd; }
public static void main(String[] args){ System.out.println(gcm(10,60));
}
Recursive gcd hesabi, sonra da lcm hesaplarken her sayinin gcd carpani ile gcd yi carpiyoruz.
Java ile Oklit algoritmasi kullanilarak anlasilabilir ve kisa bir sekilde yazilabilir bu algoritma. 2 parametre aliyor ama daha da genisletilebilir.
private long gcd(long a , long b){ if(a==0 || b == 0) return a + b; return gcd(b,a%b); }
private long gcm(long a, long b){ if(a == 0 || b == 0 ) throw new IllegalArgumentException("a and b can't be zero"); long gcd = gcd(a,b); return a/gcd * b/gcd * gcd; }
public static void main(String[] args){ System.out.println(gcm(10,60));
}
Recursive gcd hesabi, sonra da lcm hesaplarken her sayinin gcd carpani ile gcd yi carpiyoruz.
Hocam javada daha o kadar ilerlemedik,ancak dediğiniz yöntem de guzel,benim yazdigim kodu acemiliğime verin
1- Fonksiyon tanımının o kısmı opsiyonel. Python'da mod, bölme falan gibi işlemler yaparken bazen sonuç float olarak dönebiliyor. Malum, otomatik tip ataması yapılıyor. Yani genel olarak beklenir o tip bir şey. Float değil de int döndürdüğünü belirtmek adına -> int diye ekledim. Koymasak da olur da fonksiyonu kullanan adamın 10 saniyesini falan yeriz sanırım.
2- Asterisk, koddaki biçimiyle fonksiyon parametrelerinin önüne koyulunca değişken sayıda argüman ifade ediyor. Aynı şekilde double asterisk koyunca da dictionary biçiminde argüman alıyor. O da genelde **kwargs diye geçer. Parametre kısmına liste veya dict paslamadan direkt şöyle şeyler yapmaya olanak veriyor:
3- Yorumlayıcı bir dosyayı direkt olarak açmışsa (terminalden direk girilen komut ile mesela) onun ismini otomatikman __main__ yapıyor. Kodun o kısmı yalnızca o py dosyası direkt olarak açılımşsa çalışıyor. Genelde oralara test case'ler konur. Başka bir modülden import edince çalışmasın diye öyle yapılıyor.
4- : range ifade ederken kullanılıyor. Yazdığınız ifadenin doğrusu del liste[0:5] aslında. 0 ile 5 arasındakileri siliyor. 0'ı yazmayınca yorumlayıcı sorun çıkarmıyor. İstenirse 3. bir kısmı da var hatta bunun, o da step belirtiyor. del liste[0:5:2] gibi. 5'e kadar ikişer atlayarak gidiyor. liste[::2] olunca baştan sona ikişer atlıyor, liste[::-1] olunca aynı listeyi tersten yazdırıyor vs. liste[-1] de çok kullanılır, listenin son elemanını belirtir.
İsteyen klavyeden de okutturabilir kodu biraz değiştirerek.
Algoritma ilk etapta 2 omurgaya sahip, ya iki sayı eşittir,ya da değildir.
İki sayı birbirine eşit olmayınca tekrar 2 omurga açılıyor,her omurganın içinde gerekli ifadelerle algoritmamız kuruluyor
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.
< Bu mesaj bu kişi tarafından değiştirildi oksygen -- 12 Ocak 2017; 22:29:3 >