以下代码将使用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数.
标准算法用于提取编程实践中常见的实现.这使您更容易理解代码和读者理解它.使用内置算法将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)