栈法非递归化的例子

Ackermann 函数

发布于 2022-07-30
1. 栈法求解 Ackermann 函数.
unsigned int recAck(unsigned int m, unsigned int n)
{
	if (m == 0) {
		return n + 1;
	}
	// now m != 0;
	if (n == 0) {
		return recAck(m - 1, 1);
	}

	return recAck(m - 1, recAck(m, n - 1));
}

int Ack(int m, int n)
{
	/* stack node definition */
	struct {
		int mval = -1;
		int nval = -1;
		int ack = -1;
	} stk[1000];

	/* target ack initialization */
	size_t top = 0;
	stk[top].mval = m;
	stk[top].nval = n;

	while (stk[0].ack == -1) {
		if (stk[top].ack == -1) { // not yet computed;
			if (stk[top].mval == 0) {
				stk[top].ack = stk[top].nval + 1;
			}
			else if (stk[top].nval == 0) {
				++top;
				stk[top].mval = stk[top - 1].mval - 1;
				stk[top].nval = 1;
				stk[top].ack = -1;
			}
			else {
				++top;
				stk[top].mval = stk[top - 1].mval - 1;
				stk[top].nval = -1;
				stk[top].ack = -1;

				++top;
				stk[top].mval = stk[top - 2].mval;
				stk[top].nval = stk[top - 2].nval - 1;
				stk[top].ack = -1;
			}
		}
		else { // computation done;
			if (stk[top - 1].nval == -1) {
				stk[top - 1].nval = stk[top].ack;
			}
			else {
				stk[top - 1].ack = stk[top].ack;
			}

			--top;
		}
	}

	return stk[0].ack;
}