Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: RaMu - 13 Şubat 2016, 20:19:54

Başlık: Ackermann Fonksiyonu. Recursion İçerir.
Gönderen: RaMu - 13 Şubat 2016, 20:19:54
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)
Başlık: Ynt: Ackermann Fonksiyonu. Recursion İçerir.
Gönderen: tekosis - 13 Şubat 2016, 21:29:01
hocam bu fonksiyon uygulamada nerelerde kullanabilir?
Başlık: Ynt: Ackermann Fonksiyonu. Recursion İçerir.
Gönderen: mehmet - 14 Şubat 2016, 00:17:14
 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
Başlık: Ynt: Ackermann Fonksiyonu. Recursion İçerir.
Gönderen: Karamel - 14 Şubat 2016, 00:26:34
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
Başlık: Ynt: Ackermann Fonksiyonu. Recursion İçerir.
Gönderen: mehmet - 14 Şubat 2016, 00:36:09
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."
Başlık: Ynt: Ackermann Fonksiyonu. Recursion İçerir.
Gönderen: Karamel - 14 Şubat 2016, 00:45:59
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....
Başlık: Ynt: Ackermann Fonksiyonu. Recursion İçerir.
Gönderen: sovalye - 14 Şubat 2016, 00:46:27
@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.