Recursive fonksiyonlar Stack taşırır mı ?

Başlatan baran123, 15 Ağustos 2017, 01:35:02

baran123

Başlıkta sorduğum üzere Recursive fonksiyonlar Stack taşırır mı ?
Kullanması sağlıklı mıdır ? Değil ise neden ?

Örn.
int fakt(int n)
{
    if(n<=1)
        return (1);
    else
        return (n*fakt(n-1));
}

mufitsozen

#1
Alıntı yapılan: baran123 - 15 Ağustos 2017, 01:35:02
Başlıkta sorduğum üzere Recursive fonksiyonlar Stack taşırır mı ?
Kesin olarak tasirir denemez, Ama dikkatli kullanilmazsa tasirabilir. Genellikle recursion'in nasil bitecegini dogru tanimlamak gerekir. Stack overflow (yada baska hatalarin) olusmamasi icin dikkatli olunmalidir.

Alıntı yapılan: baran123 - 15 Ağustos 2017, 01:35:02
Kullanması sağlıklı mıdır ?

Kullanildigi duruma, ve programcinin bilgi ve tecrubesine gore degisir.
Benim sahsi tecrubem recursion kullanilan fonksiyonlarin yazimi tecrube ve bilgisi derin olanlar tarafindan kolay ve kisa oldugu icin tercih edilir, ama tecrubesi az yada programciliga cok iyi hakim olamamis kimselere ise anlasilmasi zor ve karisik oldugu icin problem cikartan bir yontemdir.

Genel bir kaide olarak recursive yazilabilen her fonksiyon recursive olmadan da yazilabilir. O yuzden bir programcinin yazdiginin baska programcilar tarafindan maintain edildigi projelerde, gomulu sistem ve/veya yuksek guvenilirlik vb isteyen projelerde kullanilmamasi daha dogru olur.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mir_as82

#2
Bu kodu yazmak stack açısından değilde fonksiyona giriş çıkış maliyeti açısından yazılmaması gereken bir kod bence.
Her fonksiyon girişinde 8-10 byte yer alsa ona göre stack taşar mı taşmaz mı hesabını yapabilirsiniz.

Centos 6.5 konsolundan: ulimit -a  komutu ile stack size görülebilir. Aşağıda 10MB civarıdır.
ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 12757
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

RaMu

Eğer
fonksiyonu çağırdığın andaki kalan stack alanın
fonksiyona girdiğin "n" değerinden daha küçükse stack taşar.
Örnekteki fonksiyon (n-1) defa iç içe CALL kullanmış oluyor.

Aslında en güzeli @müfitsozen hocamızında belirttiği gibi,
zaten recursive kullanmadanda yazılır, kullanmasan daha iyi.

Birde şu açıdan düşünülebilir,
bu örnekteki fonksiyon boşu boşuna CALL-RETURN ile vakit kaybediyor ve
boşu boşuna stack alanı kullanıyor.
Başka yöntemle yaz ve hız karşılaştırması yap.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html