Ackermann Fonksiyonu. Recursion İçerir.

Başlatan RaMu, 13 Şubat 2016, 20:19:54

RaMu

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

https://www.youtube.com/watch?v=i7sm9dzFtEI
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

tekosis

hocam bu fonksiyon uygulamada nerelerde kullanabilir?
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

mehmet

 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
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

Karamel

#3
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

mehmet

#4
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."
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

Karamel

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....

sovalye

#6
@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.