Tam Sürümünü Görmek İçin : Rekürsif fonksiyonlar(özyinelemeli)
mayis_1919
18/05/2007, 03:47
eksiltme adında bir fonksiyon yapmaya çalışıyorum ama hata veriyor
fonksiyonun amacı x-y işlemini yapıp 0 a enyakın değere geldiğinde duracak.
yani x=15 y=4
15-4) 11-4) 7-4) 3
3'ü görüntülemesi lazım
bu fonksiyonu rekürsif şekilde yani kendini çağıracak şekilde yapacağım ama bi türlü mantık kuramadım. Fonksiyon üzerindeki hatalarım neler acaba? yardımlarınızı bekliyorum.
int eksiltme(int x,int y)
{int sonuc;
sonuc=x-eksiltme(x-y,y);
if (sonuc<0) return sonuc+y;
}
acehreli
18/05/2007, 05:10
En temel sorunun, ozyinelemeyi kiracak olan kosulu eksiltme'yi cagirdiktan sonraya yazmis olman. (sonuc<0) kosulu hicbir zaman isletilemez ki... :)
Ali
sekizbit
19/05/2007, 15:16
Ali bey zaten konunun mantığını söylemiş. kod olarak aktarmak gerekirse
int eksiltme(int x,int y)
{int sonuc;
if (sonuc<0)
return sonuc+y;
else
sonuc=x-eksiltme(x-y,y);
}
acehreli
19/05/2007, 18:44
Ama sekizbit'in kodunda da bir hata goruyorum. :) sonuc'u denetledigimiz yerde daha degeri belli degil.
Ali
Not: Bu arada, buraya en azindan bir tane daha mektup yazildigindan eminim ama su anda gorunmuyor. (?) Acaba sahibi mi sildi yoksa ceviz.net'e bir bozukluk mu var?
sekizbit
19/05/2007, 19:09
evet dikkat etmemişim. sanırım sonuç ta argüman olarak fonksiyona sokulmalı.
int eksiltme, eğer x yerine fonksiyona sonuç sokulursa problem kalmaz.
int eksiltme(int sonuc, int y)
{
sonuc = sonuc - y;
if(sonuc<0)
return sonuc;
sonuc = eksiltme(sonuc,y) ;
if(sonuc<0)
return sonuc;
}
Not : bu kod parçacığını yazarken özyinelemeli fonksiyonlarda ne kadar zayıf olduğumu farkettim.
sekizbit yine olmamis. Kodu yazdiktan sonra calistirip test ediyormusun?
int eksiltme(int x,int y)
{
if (x < 0)
{
return x + y;
}else
{
return eksiltme(x-y,y);
}
}
sekizbit
19/05/2007, 22:04
1. sefer denenemiştim, ama ikincisinde denedim.
aslında olmamış yorumunu yapmak için, programcının fonksiyondan tam olarak ne beklediğini bilmek gerekir. mesela benim yazdığım fonksiyon da (-3,5) değelerini gönderdiğimizde sonuç okla -8 verecekken sizinkindede +2 verecek. ama belki negatif sayı için direk sayının kendisinin verilmesini bekliyor ?
ama büyük ihtimalle beklenen mod işlemi yapmasıdır, bu durumda da sizin verdiğiniz kod en doğrusudur.
aslında olmamış yorumunu yapmak için, programcının fonksiyondan tam olarak ne beklediğini bilmek gerekir.
Bencede progamcinin ne istedigini bilmek lazim. Ornegin soruyu soran arkadas x=15, y=4 girildiginde sonucun 3 olmasi gerektigini belirtmis ama x=15, y =5 girilirse sonuc = 0 mi yoksa sonuc = 5 mi orasi muallakta. Veya negatif sayilar nasil degerlendirilecek orasida pek acik degil. Ancak benim verdigim kod parcasi o arkadasin sorusuna cevap olarak degildi sizin fonksiyonda yanlis gordugum yerleri duzeltmek istemistim.
Eger yazdiginiz koda tekrar bir goz atarsaniz;
if(sonuc<0) return sonuc; // sonuc sifirdan kucuk ise geri donecek
sonuc = eksiltme(sonuc,y) ; // degil ise devam
if(sonuc<0) return sonuc; // sonuc sifirdan kucuk ise geri donecekhic bir zaman positif deger donmedigini gozlemleyeceksiniz.
mayis_1919
23/05/2007, 23:58
ilginize teşekkür ederim.
bi kod buldum o da çalışıyor.
int eksiltme(int x , int y)
{
if (x > y)
printf("(%d -%d) = %d \n",x , y , x - y);
if ( (x > 0) && (x > y) )
return eksiltme(x - y , y);
}
acehreli
24/05/2007, 01:18
Bir yerden bulmus olmana da guvenerek acik sozlu olursam: garip bir islev olmus. Tanimi soyle: Standart cikisa bir sey yazdirir ve rastgele bir deger dOndUrur.
Yani onu cagiran birisi soyle bir kod yazamaz:
int sonuc = eksiltme(15, 4);
Cunku sonuc ise yaramaz. :(
Her islevin tek bir isi olmali. Eksiltme hesabini yapan islevin bir de cikisa bir seyler gondermesini beklemeyiz. O deger dOndUrsun, sonra ben o degerle ne yapacagima karar vereyim.
Ali
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.