这个问题与斐波那契数列相似,除了我们将最后三个数字加在一起而不是最后一个2。它被称为Tribonacci。
输入:序列中的3个起始数字的数组/列表,以及(n)您希望最终模式像30个数字或10个数字等的时间长度,
输出:一个n长的数组,包含开头的3个数字,并且是正确的Tribonacci模式。
我正在codewars网站上执行此操作,因此错误代码有所不同。我在这里遇到麻烦的大部分原因是因为我对向量不了解太多,也无法退出。
std::vector<int> tribonacci(std::vector<int> signature, int n)
{
std::vector<int> result;
//add last 3 to get n
result[0]=signature[0];
result[1]=signature[1];
result[2]=signature[2];
std::cout << "Hello, World!" << std::endl;
for(int i = 3; i < n; i++) {
result[i] = signature[i-1] + signature[i-2] + signature[i-3];
std::cout << result[i];
}
return result;
}
我收到错误代码139,并且没有测试通过。
最佳答案
您不能在不首先拥有值的情况下访问向量的索引,因为它的行为不确定。例如,您可能以sigsegv结尾。有几种处理方法,例如:
使用n个值而不是大小为0的向量初始化result
向量:
std::vector<int> result(n);
// + setting first 3 values from signature vector
使用
push_back
代替索引:auto result = signature;
然后在循环中:
int sum = result[i-1] + result[i-2] + result[i-3];
result.push_back(sum)
注意:此处使用
result
向量而不是signature
来计算结果序列中的下一个元素。顺便说一下,您可能对更通用的功能
x_bonacci
感兴趣:假设我们有一个将给定矢量部分的元素求和的函数,例如:
int sum_subvector(std::vector<int>& vector, int start, int how_many){
int sum = 0;
auto start_it = vector.begin() + start;
auto end_it = start_it + how_many;
for(auto it = start_it; it != end_it; ++it)
sum += *it;
return sum;
}
我们可以拥有这样的x-bonacci函数:
// get n-element fibonacci sequence
// where each element in the sequence consists of a sum of previous x elements
// signature - vector with first x elements of the sequence
std::vector<int> x_bonacci(std::vector<int> signature, int n){
int x = signature.size(); // for tribonacci x = 3
if(n < x){
return std::vector<int>(signature.begin(), signature.begin() + n);
}
auto result = signature;
for(int i = x; i < n; i++){
auto next_result = sum_subvector(result, i - x, x);
result.push_back(next_result);
}
return result;
}
只需进行少量更改,您就可以将其转换为
tribonacci
。用法示例:
// get first 20 elements of the tribonacci sequence:
auto tribo20 = x_bonacci({0, 1, 2}, 20);
for(auto x: tribo20)
std::cout << x << ',';