STL算法生成斐波纳契数直到达到某个值

Dun*_*ith 3 c++ stl

以下代码将使用adjacent_difference算法生成前10个Fibonacci数:

v = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
std::adjacent_difference(v.begin(), v.end() - 1, v.begin() + 1, std::plus<int>());

for (auto n : v) {
    std::cout << n << ' ';
}
std::cout << '\n';
Run Code Online (Sandbox Code Playgroud)

输出:1 1 2 3 5 8 13 21 34 55

但是,如果我想继续生成Fibonacci数,直到达到(例如)4,000,000的值(例如,不是第四百万个Fibonacci数,而是第N个Fibonacci数,其值恰好是400万(或更大)),该怎么办?

显然,使用push_back执行while循环可以完成这项工作,但我想知道是否可以将STL算法与back_inserter和lambda函数结合使用以指定重复直到条件(例如,在达到或超过值400万之后停止插入)?

我看到的问题是大多数算法都在一个范围内运行,并且提前我们不知道需要多少元素才能产生400万的Fibonacci数.

izo*_*ica 5

标准算法用于提取编程实践中常见的实现.这使您更容易理解代码和读者理解它.使用内置算法将fibonnacci数累积到给定值对于您和读取代码的人来说都是一种过度杀伤.

为您的用例编写一个"哑"解决方案非常简单,并且更易于维护.例如:

void fibUpTo(int limit) {
  int a, b, c;
  a = b = 1;
  while (a < limit) {
    cout << a << endl;
    c = a + b; 
    a = b;
    b = c;
  }
}
Run Code Online (Sandbox Code Playgroud)