İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Sinema Dizi Akıllı Ev Motosiklet Mikromobilite Kripto Para Sağlık Teknolojileri Son dakika Yazarlar
  1. Ana sayfa
  2. SDN Forum
  3. Programlama
  4. Programlama Dilleri
Programlama Dilleri

c 'de özyineleme(recursion) Program çalışmayı durduruyor

bahadir77710.07.20155 cevap3.580 görüntüleme
#1
iyi günler, aşağıda özyineleme ile faktoriyel hesabı yapmaya çalıştım. fakat .exe 'yi çalıştırıp klavyeden değer girince program çalışmayı durdurdu hatası alıyorum. nedeni ne olabilir?

#include <stdio.h>
#include <stdlib.h>

long fak(int);

main(){
int a,f;
scanf("%d",a); //faktoriyeli alınacak sayıyı girin.
f=fak(a);
printf("sonuc: %d",f);
system("\npause");
return 0;
}

long fak(int x) {
if (x==0)
return 1;
else
return x*fak(x);
}
Cevaplar
#2
scanf kullanırken referans operatörünü kullanmamışsın. Son satırda return x*fak(x) ifadesi ile tam olarak ne yapmaya çalıştın? mantık hatası var gibi. Hataya sebeb olan kısımda orası olabilir. Birde faktöriyel için for döngüsünü kullanman daha doğru ve kolay olur.

#include <stdio.h>

int fact (int x);
int sonuc = 1, i;

int main()
{
int a;
scanf("%d", &a);
fact(a);

}
int fact (int x) {
for(i = 1; i <= x; i++)
{ sonuc *= i; }
printf("SONUC = %d", sonuc);
return 0;
}
#3
Eğer kodda hata yoksa (C ve C++ programlarında hata çok kolaydır ve normaldir) Stack Taşması olayı olmuş olabilir. Recursive fonksiyonlarda fonksiyon her kendini çağırdığında geri dönebilmesi için dönüş adresleri stack'a atılır. Bu sebeple çok yüksek bir sayı verilir ve fonksiyon kendi kendini çok çağırırsa stack artık almaz ve hata olur.
bahadir777 Konuyu açan
#4
sdmh dedi: ↑
Eğer kodda hata yoksa (C ve C++ programlarında hata çok kolaydır ve normaldir) Stack Taşması olayı olmuş olabilir. Recursive fonksiyonlarda fonksiyon her kendini çağırdığında geri dönebilmesi için dönüş adresleri stack'a atılır. Bu sebeple çok yüksek bir sayı verilir ve fonksiyon kendi kendini çok çağırırsa stack artık almaz ve hata olur.
hocam Stack Taşması konusunu araştırıcam.
belliki çalışma zamanlı bir hata var. fakat algoritmanın yanlış olduğunu düşünmüyorum. yani dediğiniz gibi hafızadan kaynaklanan bir hata olabilir.
fakat girdiğim değer 3! gibi küçük bir değer. yani ram i bu kadar doldurmaması gerekmez mi?
#5
Çok hata var.

1. scanf'de referans operatörünü kullanmalısın.
2. faktoriyel fonksiyonun yanlış: return x*fak(x); return x * fak (x-1) demelisin ki faktöriyle fonksiyonu 1'e kadar çalışabilsin.

Derleyici olmadan bu kadar söyleyebiliyorum. Arkadaşlar debug etmeyi bilin, teker teker satır satır debug edin, bunu yapsaydınız zaten burada bu soruyu sorma ihtiyacı hissetmezdiniz.

Stak taşması elbette oluyor ama olma nedeni durmadan aynı değerle recursive fonksiyonu sonsuz kere çağrılmasından kaynaklanıyor. Çünkü 2'de yazdığım gibi fonksiyon yanlış.
#6
return x*fak(x-1) yapman lazım yoksa sonsuz döngüye girer hata verir.

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.