为什么不编译? Tribonacci函数

时间:2019-06-13 14:50:55

标签: c++ stdvector

此问题与斐波那契数列相似,除了我们将最后三个数字加在一起而不是最后两个数字。它被称为Tribonacci。

INPUT:序列中的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,并且没有测试通过。

1 个答案:

答案 0 :(得分:1)

您不能在不首先拥有值的情况下访问向量的索引,因为它的行为不确定。例如,您可能以sigsegv结尾。有几种处理方法,例如:

  1. 使用n个值而不是大小为0的向量初始化result向量:
std::vector<int> result(n);
// + setting first 3 values from signature vector
  1. 使用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 << ',';