Soru Bu kodda nasıl bir döngü kurulmuş?

Bu konuyu okuyanlar

Mandalorian54

Öğrenci
Katılım
19 Temmuz 2021
Mesajlar
16
Reaksiyon puanı
3
Puanları
3
#include <stdio.h>

int f(int x, int y) {

if(y == 1)
return 3;

int ret = f(x, y / 3) * f(x, y / 3) * f(x, y / 3);
return ret;
}

int main() {
printf("%d", f(3, 10));

}
Bu programın sonucu nasıl 19683 çıkıyor? Burada nasıl bir döngü var? C bilen bir arkadaş cevabı anlatabilir mi?
 

mychar276

Yerli ve Milli Tech Guy
Katılım
17 Mayıs 2016
Mesajlar
2,512
Çözümler
2
Reaksiyon puanı
2,469
Puanları
113
Bu döngülere recursive denir. Kendini çağıran döngülerdir. Sürekli yapılması gereken bir iş varsa, örneğin fibonaci serisi bulma, faktöriyel bulma vb. işlerde kullanılır.
Attığın kodda F fonksiyonu içinde kendini çağırıyor. y'yi 3 3 bölüp x'in kendisini 3 defa fonksiyona geri gönderip çarpıyor.
Yanlız buradaki recursive yapı çok saçma, manasız bir yapı kurulmuş. Bir amaca veya mantıklı bir çözüme hizmet etmiyor.


f(3, 10) çağırıyor ilk olarak printf kısmında. Fonksiyon durma koşulu y=1 olana kadar kendini çağıracak.

fonksiyon y yi 3 e bölerek tekrar kendini çağırıyor. Yani f(3,3) çağrılıyor ve üç kez çarpılıyor. Bu aşama f(3,3) * f(3,3) * f(3,3) demektir

Her f(3,3) için de y yine 3 e bölünerek geri çağırılıyor yani f(3,1) den 3 tane daha çağırıp çarpıyor.

Y 2inci iterasyonda 1 olduğu için, y==1 if'ine girer ve 3 geri döndürür. Bu da ikinci iterasyondan 3*3*3 = 27 döndürür

1. iterasyondan da bu değeri üç kere çarpması istenmişti o da 27*27*27 olur. cevap 19683 tür.
 
Son düzenleme:

Mandalorian54

Öğrenci
Katılım
19 Temmuz 2021
Mesajlar
16
Reaksiyon puanı
3
Puanları
3
Bu döngülere recursive denir. Kendini çağıran döngülerdir. Sürekli yapılması gereken bir iş varsa, örneğin fibonaci serisi bulma, faktöriyel bulma vb. işlerde kullanılır.
Attığın kodda F fonksiyonu içinde kendini çağırıyor. y'yi 3 3 bölüp x'in kendisini 3 defa fonksiyona geri gönderip çarpıyor.
Yanlız buradaki recursive yapı çok saçma, manasız bir yapı kurulmuş. Bir amaca veya mantıklı bir çözüme hizmet etmiyor.


f(3, 10) çağırıyor ilk olarak printf kısmında. Fonksiyon durma koşulu y=1 olana kadar kendini çağıracak.

fonksiyon y yi 3 e bölerek tekrar kendini çağırıyor. Yani f(3,3) çağrılıyor ve üç kez çarpılıyor. Bu aşama f(3,3) * f(3,3) * f(3,3) demektir

Her f(3,3) için de y yine 3 e bölünerek geri çağırılıyor yani f(3,1) den 3 tane daha çağırıp çarpıyor.

Y 2inci iterasyonda 1 olduğu için, y==1 if'ine girer ve 3 geri döndürür. Bu da ikinci iterasyondan 3*3*3 = 27 döndürür

1. iterasyondan da bu değeri üç kere çarpması istenmişti o da 27*27*27 olur. cevap 19683 tür.

Açıklama için teşekkürler ama hala tam çözemedim bazı yerleri

Fonksiyona x:3 y:10 değerlerini gönderiyoruz.

int ret = f(x, y / 3) * f(x, y / 3) * f(x, y / 3);
return ret;
ret = f(3, 10 / 3) * f(x, 10 / 3) * f(x, 10 / 3);
ret = 3*3*3 = 27

Burada Y=3 olduktan sonra Y'nin kendini 3 olarak tekrar göndermesini sağlayan kod nedir?

if(y == 1)
return 3;
Dediğiniz gibi Y kendini 3 olarak tekrar gönderdikten sonra Y "1" olduğu için burada Y'ye tekrar 3 değerini gönderip nasıl sonsuz döngüye girmiyor?
 

mychar276

Yerli ve Milli Tech Guy
Katılım
17 Mayıs 2016
Mesajlar
2,512
Çözümler
2
Reaksiyon puanı
2,469
Puanları
113
1. iterasyon:
f(3, 10) * f(3, 10) * f(3, 10);

1 iterasyonda bitmiyor çünkü y halen 1 değil (if(y == 1) kontrolüne girmiyor)


2. iterasyon
f(3, 10 / 3) * f(3, 10 / 3) * f(3, 10 / 3);
yani > f(3, 3) *f(3, 3) * f(3, 3)

2 iterasyonda bitmiyor çünkü y halen 1 değil (if(y == 1) kontrolüne girmiyor)

3. iterasyon

f(3, 3/ 3) * f(3, 3/ 3) * f(3, 3/ 3);
yani > f(3, 1) *f(3, 1) * f(3, 1)

3. iterasyonda sayı 3 olarak geri döner çünkü if(y == 1) kontrolü çalışır.


3. iterasyonda 3 değerini döndürdü, her bir fonksiyon çağırışı için tekrar tekrar dönecek aynı sayı.
2. iterasyondaki "f(3, 3) *f(3, 3) * f(3, 3)" kımını her bir "f(3, 3)" kısmı 3*3 olacak şekilde geriye doğru güncellenecek

Bu da(3*3*3) * (3*3*3) * (3*3*3) yapar
Sonuç 19683 olur

yazarak daha da basite indirgeyemem. İterasyonları takip ederek geriye doğru hesaplaman lazım.
 
Üst