rekürsif fonksiyon

Kodla Büyü

kade38

Üye
Mesajlar
484
merhaba arkadaşlar bir uygulama da takıldım. Yardımcı olabilir misiniz?

function f(n)
if n <= 1:
print_line("**")
else:
for i=1 to n
f(n/2)
end for

verilen fonksiyonda n değerini 2 nin bir kuvveti olarak kabul edebiliriz.
Girilen n değerine göre ekrana "**" yazma işlemini nasıl bağıntılayabiliriz(formülleştirebiliriz)?

Çıktılar
n=2 için
**
**
n=4 için
**
**
**
**
**
**
**
**
n=8 için 64 adet **
 
soru.JPG
 
public static void Main()
{
Console.Clear();
f(8);
}

public static void f(double n)
{
Console.WriteLine("n="+n);
if (n>1)
{
for(int i=1;n>=i;i++)
{
f(n/2);
}
}
else
{
Console.Write(" **");
}
Console.WriteLine();
}

Amacınızı anlamadım ama belki budur
 
Sanırım arkadaş örüntünün matematiksel fonksiyonunu istiyor.
F x =2 üstü n -1. gibi

Ama örüntü yok gibi.
Daha fazla veri lazım.
 
Sanırım arkadaş örüntünün matematiksel fonksiyonunu istiyor.
F x =2 üstü n -1. gibi

Ama örüntü yok gibi.
Daha fazla veri lazım.
evet hocam uygulamanın zaman karmaşıklığını bulmaya çalışıyorum.
soruda verilen kod bu kadar. sadece n değerini 2 nin bir kuvveti olarak alabileceğimiz belirtiliyor
 
Kodlarınızı uyarladığımda sorunsuz çalışıyor ancak rust dilinde. Kodlarınızda hata veriyor mu?
 
Girilen n değeri taban olarak giriliyor sanırım. n örneği olarak 2 ve 4 örnekleri kafa karıştırmış.(Çünkü 2^2=2^2 ve 2^4=4^2 oluyor. Yani üs ve tabanlar yer değiştirse de sonuç değişmiyor.)Ancak n=8 için 2^8≠8^2 . Yani soruyu açık sormamışsınız. Girilen n ifadesi taban oluyor ve karesi kadar ekrana * işareti yazılıyor. Tabii her satırda ** yazıldığı için mesela n=4 girildiğinde 4^2 kadar * olması gerekiyor, ** yazıldığı için de 16/2=8 satır ** yazılıyor.

upload_2021-3-14_22-21-12.png


Recursive fonksiyon kullanıyorsanız for falan kullanmayın. Döngüyü zaten recursive fonksiyonla kuruyorsunuz. For'u kaldırdım. Js'te bu şekilde yazılabilir. Dıştaki fonksiyon(outerFunction) sadece karesini alıp, ikiye bölmek için(çünkü ** şeklinde basıyoruz). İçteki fonksiyon ise(innerFunction) asıl işi yapan recursive fonksiyonumuz oluyor.

İyi çalışmalar. Kolay gelsin.
 
Son düzenleme:
resim_2021-03-14_222921.png

soru bu kadar hocam. soruyu açık sormadığımı yazmışsınız ama daha nasıl açık yazayım. for döngüsünü bende kaldırmak isterdim ama soruyu değiştiremiyorum
 
Girilen n değeri taban olarak giriliyor sanırım. n örneği olarak 2 ve 4 örnekleri kafa karıştırmış.(Çünkü 2^2=2^2 ve 2^4=4^2 oluyor. Yani üs ve tabanlar yer değiştirse de sonuç değişmiyor.)Ancak n=8 için 2^8≠8^2 . Yani soruyu açık sormamışsınız. Girilen n ifadesi taban oluyor ve karesi kadar ekrana * işareti yazılıyor. Tabii her satırda ** yazıldığı için mesela n=4 girildiğinde 4^2 kadar * olması gerekiyor, ** yazıldığı için de 16/2=8 satır ** yazılıyor.

Ekli dosyayı görüntüle 69369

Recursive fonksiyon kullanıyorsanız for falan kullanmayın. Döngüyü zaten recursive fonksiyonla kuruyorsunuz. For'u kaldırdım. Js'te bu şekilde yazılabilir. Dıştaki fonksiyon(outerFunction) sadece karesini alıp, ikiye bölmek için(çünkü ** şeklinde basıyoruz). İçteki fonksiyon ise(innerFunction) asıl işi yapan recursive fonksiyonumuz oluyor.

İyi çalışmalar. Kolay gelsin.
hocam uygulamanızı c# a dönüştürüp denedim.
n=2 için 2 adet **
n=4 için 8 adet **
n=8 için 32 adet **
n=16 için 128 adet **
n=32 için 512 adet ** ifadesini veriyor. yani soru ile farklılık gösteriyor.
 
hocam uygulamanızı c# a dönüştürüp denedim.
n=2 için 2 adet **
n=4 için 8 adet **
n=8 için 32 adet **
n=16 için 128 adet **
n=32 için 512 adet ** ifadesini veriyor. yani soru ile farklılık gösteriyor.

Çünkü ilk verdiğiniz verilere göre cevap öyle :D ve yanlış.

Son verdiğiniz bilgi ışığında algoritması şu şekilde. mesela n=4 için 4.2=8 adet, n=8 için 8.4.2=64 adet, n=16 için 16.8.4.2=1024 adet ** yazıyor. Bunun da recursive fonksiyonunu yazıp verebilirim isterseniz.
 
Son düzenleme:
Çünkü ilk verdiğiniz verilere göre cevap öyle :D ve yanlış.

Son verdiğiniz bilgi ışığında algoritması şu şekilde. mesela n=4 için 4.2=8 adet, n=8 için 8.4.2=64 adet, n=16 için 16.8.4.2=1024 adet ** yazıyor. Bunun da recursive fonksiyonunu yazıp verebilirim isterseniz.
desteğiniz için teşekkür ederim hocam. karmaşıklığı @impetus23 hocamın belirttiği gibi n^logn çıkıyor sanırım
 
desteğiniz için teşekkür ederim hocam. karmaşıklığı @impetus23 hocamın belirttiği gibi n^logn çıkıyor sanırım

Algoritmanın karmaşıklığı O(c^n) hocam. Algoritma karmaşıklığı konusunu çalışalı epey zaman oldu. Tam hatırlamıyorum. Ama mesela n=4 için 4.2 oluyor ya, bu 2^2*2^1=2^3 şeklinde yazarız. 8 için 8.4.2=2^3*2^2*2^1=2^7 olur. 16 için de 2^10 olarak çıkar. Yani üsler toplanıyor. Bunu 2^n*(n+1)/2 formülü şeklinde yazarız. Sonuçta da algoritma O(2^n) karmaşıklığında çalışır diye düşünüyorum.
 
Şimdi biraz daha inceledim.
Şöyle açıklayayım (hatam olabilir);
f(2) için 2 yani n
f(4) için 4x8=32 yani 2n^2
f(8) için 8x32x64=4n^4 şeklinde gidiyor. Bu da 2^((logn)-1) x n^(2^((logn)-1)) oluyor sanırım. Umarım doğrudur. Başlarındaki 1-2-4 almasak sadece 2. kısmı da olabilir.
 
Geri
Üst