2016-09-08 15 views
2

私はダミーリスト{1,1,1,1,1,1}からフィボナッチ数のリストを返す関数fibonacciを持っています。ここに私のコードです。代わりに計算するために、ラムダ式[](constのリストA、int型B)を通過するラムダの代わりに関数を使用するようにこのコードを変更するにはどうすればよいですか?

list<int> immutableFibonacci(int position) 
{ 
list<int> oldList(position, int(1)); 

list<int> newList = accumulate(oldList.begin(), oldList.end(), list<int>{}, 
    [](const list<int> a, int b) 
{ 
    list<int> d = a; 

    if (a.size()<2) 
    { 
     d.push_back(1); 
    } 
    else 
    { 
     auto start = d.rbegin(); 
     auto first = *start; 
     start++; 
     auto second = *start; 
     d.push_back(first + second); 
    } 
    return d; 
}); 
    return newList; 
} 

、私は、関数の名前を渡したいです。これをやり遂げるにはどうすればいいですか?基本的に関数immutableFibonacciの中の関数ですが、これを行う上で問題があります。

+2

関数を作成してそれを積み重ねようとしましたか? – NathanOliver

+0

私は[](constリスト a、int b)で何が起こっているかわからないので、私はそれを始める方法がわかりません –

+0

@coding_xeno:私の答えを見てください。前回の回答の質問でラムダ定義を残念に思っています。私は時々少し怠惰になる。それはラムダの欠点です。私はあまりにも好きです! :-D –

答えて

1

代わりの:

list<int> newList = accumulate(oldList.begin(), oldList.end(), list<int>{}, 
    [](const list<int> a, int b) 
{ 
    list<int> d = a; 

    if (a.size()<2) 
    { 
     d.push_back(1); 
    } 
    else 
    { 
     auto start = d.rbegin(); 
     auto first = *start; 
     start++; 
     auto second = *start; 
     d.push_back(first + second); 
    } 
    return d; 
}); 

上、このような実際の機能を、渡します。カスタムコンパレータの

list<int> newList = accumulate(oldList.begin(), oldList.end(), list<int>{}, 
    funcname); 

//Below is the function  

list<int> funcname(list<int> a, int b) { 
    list<int> d = a; 

    if (a.size()<2) 
    { 
     d.push_back(1); 
    } 
    else 
    { 
     auto start = d.rbegin(); 
     auto first = *start; 
     start++; 
     auto second = *start; 
     d.push_back(first + second); 
    } 
    return d; 
} 

、あなたが関数ポインタ、またはラムダを渡すことができますいずれか、そしてあなたの例のために、あなたがラムダを使用する:あなたは、関数ポインタが必要です。

+0

これは動作していないようです。既に閉じているセミコロンが蓄積されています。だから、なぜ戻ってきた後にセミコランがあるのですか? –

+0

return d; }); < - –

+0

@coding_xenoこれはカットアンドペーストミスです。 'accumulate'の呼び出しの上に関数を置くことをお勧めします。あなたに前方宣言を保存します。これがあなたの問題を解決するために取っておきたいアプローチだと確信していますか?私は心からあなたがインターネットから得たものを理解するコードを使用することをお勧めします。試験に合格する確率はかなり高いです。 – user4581301

0

あなたはこのようimmutableFibonacci関数内ファンクタを作成することができます。

struct 
{ 
    list<int> operator()(const list<int>& a, int b) const 
    { 
     //...then put your lambda code here... 
    } 
} funObj; 

をそしてだけではなく、ラムダの累積関数の内部で「funObj」の名前を使用します。それで全部です。私の答えは:-)を使用するための

1

おかげ - >How can I use accumulate in C++ to create the Fibonacci sequence?

ここでは、あなたの質問に対する私のソリューションです:g++ --std=c++14 fibo.cpp -o fibo

#include <iostream> 
#include <vector> 
#include <numeric> 
#include <string> 
#include <functional> 



auto fibo (std::vector<int>& a, int b) 
{ 
    if(a.size()<2) 
    { 
      a.push_back(1); 
    } 
    else 
    { 
      auto start = a.rbegin(); 
      auto first = *start; 
      start++; 
      auto second = *start; 
      a.push_back(first+second); 
    } 
    return a; 
} 

int main() 
{ 
    const std::vector<int> v{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; 

    std::vector<int> s = std::accumulate(v.begin(), v.end(), 
            std::vector<int>{}, fibo); 

    std::cout << "Fibo: " <<'\n'; 

    for(auto c : s) 
    { 
     std::cout << c << "-"; 
    } 
    std::cout << '\n'; 
} 

はとそれをコンパイルすることを忘れないでください。

+0

とても助かりました!あなたは十分にありがとう –

+0

@coding_xeno:あなたは歓迎しています。あなたがこのようなことをしているのなら、なぜ私の答えをupvoteしないのですか?私は非常に感謝されます。 :-) –

関連する問題