我正在尝试使用 unsinged long long
tuple
实现ackerman函数这是我要创建的台词
A(m, n) = A(m - 1, A(m, n - 1))
所以这是我的代码:
uint_type calculate(tuple_type const& args) const {
uint_type retval;
uint_type retval;
auto second = make_tuple(m - 1, calculate(make_tuple(m, n - 1)));
auto first = make_tuple(m - 1, second);
retval = calculate(first);
return retval;
}
};
这是错误:
错误:没有可行的'tuple< [...]的可行转换 std :: __ 1 :: tuple>'to'const 元组< [...],uint_type>' retval =计算(firstTuple);
^~~~~~~~~~~~
如果您使用大量auto
和模板功能(例如make_tuple
),有时很难找到类型错误。这是您少使用auto
和make_tuple
的写作方式:
uint_type calculate(tuple_type const& args) const {
const uint_type m = get<0>(args);
const uint_type n = get<1>(args);
uint_type retval;
tuple_type second{m - 1, calculate(tuple_type{m, n - 1})};
tuple_type first{m - 1, second};
// ^^^^^^ error
retval = calculate(first);
return retval;
}
您可以看到如何添加夫妇类型注释将错误消息完全移动到错误的位置。
但是,这不是ackermann函数。这是Ackermann功能:
uint_type calculate(tuple_type args) const {
const uint_type m = get<0>(args);
const uint_type n = get<1>(args);
if (m == 0)
return n + 1;
if (n == 0)
return calculate(tuple_type{m - 1, 1});
return calculate(tuple_type{m - 1, calculate(tuple_type{m, n - 1})});
}
请注意,可以省略tuple_type
:
uint_type calculate(tuple_type args) const {
const uint_type m = get<0>(args);
const uint_type n = get<1>(args);
if (m == 0)
return n + 1;
if (n == 0)
return calculate({m - 1, 1});
return calculate({m - 1, calculate({m, n - 1})});
}