Написать ряд Фибоначчи через лямбду не принимающую аргументов
Создайте переменную с названием 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;
}
}
Автор решения: 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";
}
}