PDA

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.

Sabahi
19/05/2007, 20:15
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.

Sabahi
20/05/2007, 00:39
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