我已經在C中編寫了下面的代碼。我們可以稱之爲尾遞歸實現嗎?Ackermann函數的這個實現可以稱爲尾遞歸嗎?
#include <stdio.h>
int ackermann(unsigned int *m, unsigned int *n, unsigned int* a, int* len)
{
if(!*m && *len == -1) {
return ++*n;
}
else if(!*m && *len >= 0) {
++*n;
*m = a[(*len)--];
}
else if(*n == 0) {
--*m;
*n = 1;
} else {
++*len;
a[*len] = *m - 1;
--*n;
}
return ackermann(m, n, a, len);
}
int main()
{
unsigned int m=4, n=1;
unsigned int a[66000];
int len = -1;
for (m = 0; m <= 4; m++)
for (n = 0; n < 6 - m; n++) {
unsigned int i = m;
unsigned int j = n;
printf("A(%d, %d) = %d\n", m, n, ackermann(&i, &j, a, &len));
}
return 0;
}
如果不是尾遞歸,請建議如何使它這樣。任何對Ackermann尾遞歸版本的引用在C/C++/Java或非函數式編程語言中都會很好。
如果問題解決了問題,請將相應的答案標記爲_solution_,這樣未來的讀者可以輕鬆識別解決方案。 –