Bilen biliyordur ama
ben yeni gördüm.
ack(3,5); 'i bile hesaplatmak çok uzun zaman alıyor,
ack(9,9); gibi hesabı yapmasını beklemeyelim bile.
#include <stdio.h>
int ack(m,n)
int m,n;
{
int ans;
if (m == 0) ans = n+1;
else if (n == 0) ans = ack(m-1,1);
else ans = ack(m-1, ack(m,n-1));
return (ans);
}
int main (argc, argv)
int argc; char ** argv;
{ int i,j;
for (i=0; i<6; i++)
for (j=0;j<6; j++)
printf ("ackerman (%d,%d) is: %d\n",i,j, ack(i,j));
}
Kaynak:
http://www.eprg.org/computerphile/recursion.htm (http://www.eprg.org/computerphile/recursion.htm)
https://www.youtube.com/watch?v=i7sm9dzFtEI (https://www.youtube.com/watch?v=i7sm9dzFtEI)
hocam bu fonksiyon uygulamada nerelerde kullanabilir?
8-) 8-) 8-)
time ./Ackermann
ackerman (0,0) is: 1
ackerman (0,1) is: 2
ackerman (0,2) is: 3
ackerman (0,3) is: 4
ackerman (0,4) is: 5
ackerman (0,5) is: 6
ackerman (1,0) is: 2
ackerman (1,1) is: 3
ackerman (1,2) is: 4
ackerman (1,3) is: 5
ackerman (1,4) is: 6
ackerman (1,5) is: 7
ackerman (2,0) is: 3
ackerman (2,1) is: 5
ackerman (2,2) is: 7
ackerman (2,3) is: 9
ackerman (2,4) is: 11
ackerman (2,5) is: 13
ackerman (3,0) is: 5
ackerman (3,1) is: 13
ackerman (3,2) is: 29
ackerman (3,3) is: 61
ackerman (3,4) is: 125
ackerman (3,5) is: 253
ackerman (4,0) is: 13
ackerman (4,1) is: 65533
Parçalama arızası (çekirdek döküldü)
real 2m40.971s
user 2m37.258s
sys 0m0.048s
hocam ben code lari asagidaki gibi duzenleyince visual studio ile compile edebildim. mehmet hocamin verdigi ciktiyi aldim.
#include <stdio.h>
int ack(int m, int n)
{
int ans;
if (m == 0) ans = n+1;
else if (n == 0) ans = ack(m-1,1);
else ans = ack(m-1, ack(m,n-1));
return (ans);
}
int main ()
{
int argc; char ** argv;
int i,j;
for (i=0; i<6; i++)
for (j=0;j<6; j++)
printf ("ackerman (%d,%d) is: %d\n",i,j, ack(i,j));
}
mesaj birleştirme:: 14 Şubat 2016, 00:30:10
main icersindeki bu variable larin bir gorevi yok?
Alıntı Yap
int argc; char **argv;
ayrica asagidaki code lar ile. sonsuza dek recursuve etmis olmuyormuyuz?
if (m == 0) ans = n+1;
else if (n == 0) ans = ack(m-1,1);
else ans = ack(m-1, ack(m,n-1));
return (ans);
mesaj birleştirme:: 14 Şubat 2016, 00:31:11
simdi videoyu izliyorum. codelari yanlis yorumlamista olabilirim :-\
mesaj birleştirme:: 14 Şubat 2016, 00:35:14
verdiginiz linkten baktim. hesap sonucsuz degilmis. hesabi varmis ama 4,1 de cok vakit aliyormus. herhalde. visual studio gereginden fazla loop oldugunda kendini otomatik stop yapiyor.
bide Wilhelm Ackermann hakkinda biraz bilgi ekliyeyim ::)
https://en.wikipedia.org/wiki/Wilhelm_Ackermann
https://en.wikipedia.org/wiki/Ackermann_function
Bu şekilde düzenlemek daha iyi olacaktır...
#include <stdio.h>
int ack(int m, int n)
{
int ans;
if (m == 0) ans = n + 1;
else if
(n == 0) ans = ack(m - 1, 1);
else ans = ack(m - 1, ack(m, n - 1));
return (ans);
}
int main (int argc, char ** argv)
{
int i = 0, j = 0, k = 0;
for (i = 0; i < 6; i++)
for (j = 0; j < 6; j++)
printf ("ackerman (%d, %d) is: %d\n", i, j, ack(i, j));
return 0;
}
https://en.wikipedia.org/wiki/Ackermann_function
"For example, A(4,2) is an integer of 19,729 decimal digits."
hocam main in tanimlamasinda yani int main (int argc, char ** argv) bu kisimda visual studio error vermisti. siz yazinca yeniden denedim. yine error verdi. bende bir yanlis olabilir.
hocam main icin int argc, char ** argv variable larini nerede kullaniyoruz? :-\ ben bunlari tam olarak anlayamadim....
@Karamel hocam o değişkenler işlevsiz değil. Biraz yazım standardı. Program cmd'den çağırıldığında standarda uysun amaçlı. Eğer prgoramı cmd den çağırırsanız programı çağırmadan önce cmd içinden parametre aktarabiliyorsunuz. argv dizisi aktardığınız parametler oluyor, argc ise argv dizisinin kaç elemanlı olduğudur. Main in parametre kısımı içinde tanımlanmış olmaları lazım.
Sonsuz döngü de yaratmıyor. Sonuncu Else içerdeki Elseif in, Program m ve n 0 olduğu anda rekürsif işlemi kesiyor.