下面是Ackermann函数的迭代实现,以供审查:
#include <stack>
#include <iostream>
#include <tuple>
#include <vector>
int Ackermann(int m, int n) {
std::stack<int> s;
s.push(m);
while (!s.empty()) {
m = s.top();
s.pop();
if (m == 0 || n == 0)
n += m + 1;
else {
s.push(m - 1);
s.push(m);
n--;
}
}
return n;
}
int main() {
std::vector<std::tuple<int, int, int>> tests{
{ 0, 0, 1},
{ 1, 0, 2},
{ 1, 1, 3},
{ 2, 1, 5}
};
for (auto const &test : tests) {
using std::get;
auto result = Ackermann(get<0>(test), get<1>(test));
if (result == get<2>(test)) {
std::cout << "Ackermann("
<< get<0>(test) << ", "
<< get<1>(test) << ") == "
<< result << ": passed\n";
}
else {
std::cerr << "Error: Ackermann("
<< get<0>(test) << ", "
<< get<1>(test)
<< ": expected" << get<2>(test)
<< ", but got: " << result << "\n";
}
}
}
如有任何意见请见谅。
发布于 2017-02-28 17:25:49
Ackermann函数的结果可以增长相当大。保证一个int
最多可以覆盖32767。
一张二维记忆表可能是值得的。
https://codereview.stackexchange.com/questions/156552
复制相似问题