2013-10-15 17 views
3

下面的代碼將使用adjacent_difference算法產生第一10支斐波那契數:STL算法生成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'; 

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

但是,如果我想繼續產生斐波那契數,直到一個與(比如說)是達到400(例如,不第四百萬分之一Fibonacci數,而是其價值正好是4的第N個斐波納契數的值是什麼百萬(或更高))。

很明顯,使用push_back做do while循環可以完成這項工作,但我想知道是否可以將STL算法與back_inserter和lambda函數結合使用來指定repeat until條件(例如,在值400萬之後停止插入達到或超過)?

我看到的問題是大多數算法都在一個範圍內運行,並且提前計算我們不知道需要多少元素才能生成400萬的斐波納契數。

+3

但是,恩,好吧,爲什麼? – PlasmaHH

+0

提供*生成器比試圖強制使用庫的特定子集要容易得多。 –

+0

你需要在程序上找到它嗎?您可以使用[封閉式表達式](https://en.wikipedia.org/wiki/Fibonacci_number#Computation_by_rounding)。 –

回答

2

隨着find_if和升壓迭代器的lib一點幫助:

#include <boost/iterator/function_input_iterator.hpp> 
#include <algorithm> 
#include <climits> 

struct fibonacci_generator { 
    typedef int result_type; 
    fibonacci_generator() : n(0) {} 
    // dummy generator 
    // put the code to generate fibonacci 
    // sequence here 
    int operator()() { return n++; } 
private: 
    int n; 
}; 

int main() 
{ 
    fibonacci_generator g; 
    int i = *std::find_if(
     make_function_input_iterator(g, boost::infinite()), 
     make_function_input_iterator(g, boost::infinite()), 
     [](int i) { return i > 1000000; }); 
} 

一個​​算法可能是結果推回矢量這裏是有用的,但你需要編寫自己的。

+0

所以基本上...你創建一個函數來解決真正的問題,而不是調用它你包裝在一個迭代器適配器,以便您可以使用一個算法,你不需要和lambda ... :) –

+0

@DavidRodríguez -dribeas是:)我個人不會這樣做,但似乎OP可以利用它。 – jrok

3
int my_plus(int a, int b) 
{ 
    int result = a + b; 
    if (result >= 4000000) 
     throw result; 
    return result; 
} 

try { 
    adjacent_difference(v.begin(), v.end() - 1, v.begin() + 1, my_plus); 
} catch (int final) { 
    cout << final << endl; 
} 

這就是我認爲的「笨拙的黑客」,但我認爲它會奏效。如果你想讓它變得更漂亮一些,可以創建一個異常類來保存最終結果,而不是拋出一個原始整數。並使閾值成爲模板參數。

但是,真的,不要做任何這樣的事情,因爲這是一個愚蠢的黑客攻擊:就像你剛纔提到的那樣使用「for」循環。

5

標準算法用於提取編程實踐中常見的實現。這使您更容易理解代碼並讓讀者理解它。使用內置算法將斐波納契數字累加至給定值對您和任何讀取您的代碼的人來說都是一種矯枉過正的行爲。

爲你的用例寫一個'笨'的解決方案非常簡單,而且容易維護。例如:

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