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

bahadir777

Öğrenci
Katılım
9 Temmuz 2015
Mesajlar
12
Reaksiyon puanı
0
Puanları
0
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);
}
 
Katılım
11 Ağustos 2010
Mesajlar
5,807
Reaksiyon puanı
66
Puanları
48
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;
}
 

sdmh

Profesör
Katılım
22 Ağustos 2008
Mesajlar
1,108
Reaksiyon puanı
14
Puanları
38
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

Öğrenci
Katılım
9 Temmuz 2015
Mesajlar
12
Reaksiyon puanı
0
Puanları
0
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?
 

falcon291

Profesör
Katılım
6 Eylül 2012
Mesajlar
1,360
Reaksiyon puanı
45
Puanları
48
Ç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ış.
 

Tembel34

Öğrenci
Katılım
8 Ağustos 2015
Mesajlar
8
Reaksiyon puanı
0
Puanları
0
return x*fak(x-1) yapman lazım yoksa sonsuz döngüye girer hata verir.
 
Üst