这个问题与斐波那契数列相似,除了我们将最后三个数字加在一起而不是最后一个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 << ',';

10-08 08:55