Написать ряд Фибоначчи через лямбду не принимающую аргументов

Создайте переменную с названием fib, которая является лямбдой. Каждый вызов этой переменной выводид по очередности элементы ряда Фибоначчи начиная от 0. Можно написать в пару строчек, используя std::exchange. Пример кода:

auto fib = ...;
cout << fib;
cout << fib;
cout << fib;
cout << fib;

Вывести должно: 0 1 1 2 Буду благодарен за помощь.


Ответы (4 шт):

Автор решения: KoVadim

Так можно сделать, почти так как Вы хотите. (если что - код грязный, его нужно чуточку улучшить)

int main() {
auto fib = []() -> int {
    static int i = 0;
    static int p1 = 0;
    static int p2 = 0;
    i++;
    if (i == 1) {
        return 0;
    } else if (i == 2) {
        p1 = 1;
        p2 = 0;
        return 1;
    } else {
        int n = p1+p2;
        p2 = p1;
        p1 = n;
        return n;
    }
};

std::cout << fib();
std::cout << fib();
std::cout << fib();
std::cout << fib();
std::cout << fib();
}
→ Ссылка
Автор решения: Woji

Задание сделать именно через лямбду. Получилось что-то такое:

int i = 0;
int i1= 1;
int res  = 0;
auto fibonacci = [&i,&i1,&res](){
    i=i1;
    i1=res;
    return std::exchange(res,i + i1);
};
        std::cout << fibonacci() << ' '
        << fibonacci() << ' '
        << fibonacci() << ' '
        << fibonacci() << ' '
        << fibonacci();

    }
→ Ссылка
Автор решения: user7860670

Можно так, переменных нужно только две, захватывать что-то снаружи или городить статики также не требуется:

#include <iostream>

int main()
{
    auto fib
    {
        [cur{0}, next{1}] (void) mutable
        {
            auto const prev{cur};
            cur = next;
            next = prev + cur;
            return prev;
        } 
    };
    for (auto count{10}; 0 < count; --count)
    {
        ::std::cout << fib() << ::std::endl;
    }
}

online compiler

→ Ссылка
Автор решения: Croessmah
#include <iostream>
#include <utility>

int main()
{
    auto fib = [f1 = 0u, f2 = 1u]() mutable { 
        return std::exchange(f1, std::exchange(f2, f2 + f1)); 
    };    


    for (unsigned i = 0; i < 10; ++i) {
        std::cout << "fib " << i << " = " << fib() << "\n";
    }
}
→ Ссылка