Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: baran123 - 15 Ağustos 2017, 01:35:02

Başlık: Recursive fonksiyonlar Stack taşırır mı ?
Gönderen: baran123 - 15 Ağustos 2017, 01:35:02
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));
}
Başlık: Ynt: Recursive fonksiyonlar Stack taşırır mı ?
Gönderen: mufitsozen - 15 Ağustos 2017, 08:51:06
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.

Başlık: Ynt: Recursive fonksiyonlar Stack taşırır mı ?
Gönderen: mir_as82 - 15 Ağustos 2017, 08:51:56
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
Başlık: Ynt: Recursive fonksiyonlar Stack taşırır mı ?
Gönderen: RaMu - 15 Ağustos 2017, 19:02:51
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.