迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

C++ 中的递归 Lambda 函数

作者:迹忆客 最近更新:2023/09/03 浏览次数:

在本文中,我们将了解 C++ 中可用的递归 lambda。


C++ 递归 Lambda 函数

递归是指函数(直接或间接)调用自身的过程,这个过程对应的函数称为递归函数。 递归 lambda 表达式是此过程的结果。

当使用递归方法解决某些问题时,解决起来要简单得多。

在重构本地代码的过程中,lambda 是一个有用的工具。 另一方面,在某些情况下我们希望从内部使用 lambda。

这样做可能出于以下两个原因之一:启用直接递归或使闭包可以注册为延续。 当前版本的 C++ 使得这项任务很难成功完成。

C++ 递归 Lambda 函数的实现

第一步,我们将导入必要的库。

#include <functional>
#include <iostream>

在 main() 函数中,初始化一个 int 类型的变量并为其分配一个整数值。

int main()
{
    int anyNumber = 456789;
}

然后,创建一个类型为 void 的函数,并将其命名为verseByRecursiveLambda。

function<void()> reverseByRecursiveLambda;

现在,使用递归 lambda 函数初始化reverseByRecursiveLambda 函数。

reverseByRecursiveLambda = [&]() {};

在此方法中,您应该实现一个检查,表明如果 anyNumber 的整数值等于 0,则不应返回任何内容。 如果不是这种情况,该函数应继续执行下一组操作。

然后,该函数将执行一系列数学计算,然后打印结果。 最后一步,它将再次运行名为reverseByRecursiveLambda()的函数。

if (anyNumber == 0)
  return;

cout << anyNumber % 10 << " ";
anyNumber /= 10;
reverseByRecursiveLambda();

该函数完成执行后,唯一需要做的就是在 main() 方法中调用该函数。

int main()
{
    reverseByRecursiveLambda();
}

完整源代码:

#include <functional>
#include <iostream>

using namespace std;

int main()
{
    int anyNumber = 123456789;

    function<void()> reverseByRecursiveLambda;

    reverseByRecursiveLambda = [&]() {
        if (anyNumber == 0)
            return;

        cout << anyNumber % 10 << " ";
        anyNumber /= 10;
        reverseByRecursiveLambda();
    };

    reverseByRecursiveLambda();
}

输出:

9 8 7 6 5 4 3 2 1

使用 std::function 的 C++ 递归 Lambda 函数

std::function 类模板是一个多态函数包装器,可用于各种目的。 任何 lambda 表达式绑定表达式或其他函数对象都可以在 std::function 类的实例内存储、复制和调用。

此外,这些实例可以保存指向成员函数的指针和指向数据成员的指针。

在下面的示例中,我们需要拍摄阶乘的快照,然后我们可以在 lambda 体内引用它。

示例代码:

#include <functional>
#include<iostream>

int main() {

    const std::function<int(int)> factorial = [&factorial](int n) {
        return n > 1 ? n * factorial(n - 1) : 1;
    };

    std::cout << "The factorial of 5 is: " << factorial(5);
    return factorial(5);
}

输出:

The factorial of 5 is: 120

使用通用 Lambda 的 C++ 递归 Lambda 函数

泛型 Lambda 表达式是指至少具有一个 auto 类型参数的 lambda 表达式。

创建递归 lambda 函数不需要使用 std::function ,这要归功于通用 lambda 表达式,这使得此选项成为可能。 lambda 表达式的类型不能仅通过其名称来确定。

因此,在 C++14 发布之前,需要将递归 lambda 表达式包含在 std::function 内。 它不依赖于 std::function,并且不需要捕获任何数据即可在任何数字基本类型上正确执行。

在示例中,我们将演示如何使用通用 lambda auto 显示存储在映射中的数据。

示例代码:

#include <algorithm>
#include <iostream>
#include <map>
#include <string>

int main() {
    const std::map<std::string, int> numbers {
        { "Saad", 22 }, {"Zaryab", 23 }, {"Zeeshan", 24 }
    };

    std::for_each(std::begin(numbers), std::end(numbers),
        [](const auto& entry) {
            std::cout << "Name: " << entry.first << "   Age: " << entry.second << '\n';
        }
    );
}

GCC 11.1.0 是本演示中使用的编译器的名称。

输出:

Name: Saad   Age: 22
Name: Zaryab   Age: 23
Name: Zeeshan   Age: 24

使用 y_combinator 的 C++ 递归 Lambda 函数

由于匿名函数(也称为 lambda)仅在逻辑简单且应提取到命名函数时使用,因此不可能在 lambda 内进行递归调用。

然而,让我们想象一下,我们不能使用递归。 只要函数在我们的语言中被视为一等公民(它们可以分配给变量,作为参数提供,并像任何其他对象一样返回),我们仍然可以编写递归实现。

Y 组合器是用于此目的的一个有用的高阶函数。 尽管它的名字听起来不祥,但它只是一个高阶函数,一个包装另一个函数的函数。

以下是使用 y 组合器创建递归 lambda 函数来列出斐波那契数列的示例。

示例代码:

#include <iostream>

template<typename Function>
struct YCombinator
{
    Function yFunction;

    template<typename... Args>
    decltype(auto) operator()(Args&&... args)
    {
        return yFunction(*this, std::forward<Args>(args)...);
    }
};

template<typename Function>
decltype(auto) make_YCombinator(Function f) {
    return YCombinator<Function> { f };
}

int main()
{
    auto fib = make_YCombinator([](auto self, int n) {
        if (n < 2)
            return 1;
        return self(n - 1) + self(n - 2);
    });

    for (int i = 0; i < 10 ; ++i)
        std::cout << "fib(" << i << ") = " << fib(i) << "\n";

    return 0;
}

GCC 11.1.0 是本演示中使用的编译器的名称。

输出:

fib(0) = 1
fib(1) = 1
fib(2) = 2
fib(3) = 3
fib(4) = 5
fib(5) = 8
fib(6) = 13
fib(7) = 21
fib(8) = 34
fib(9) = 55

上一篇:C++状态机的概念

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C++状态机的概念

发布时间:2023/09/02 浏览次数:167 分类:C++

本文向我们介绍了 C++ 状态机的概念,说明了如何使用它,并强调了它的优点。C++ 状态机概述 要理解C++中的状态机,我们首先应该了解有限状态机的概念。

C++包含路径的概念

发布时间:2023/09/02 浏览次数:97 分类:C++

包含路径用于告诉编译器在哪里查找头文件。 编译器将在这些路径指定的目录中搜索,直到找到名称匹配的头文件。Visual Studio IDE 中的 C++ 包含路径目录

在 C++ 中指定 64 位整数

发布时间:2023/09/02 浏览次数:50 分类:C++

在本文中,我们将讨论和学习如何在 C++ 中指定 64 位整数。 此外,当使用 64 位整数出现问题时,我们将比较旧方法。

C++ 中的大整数

发布时间:2023/09/02 浏览次数:151 分类:C++

在本文中,我们将讨论在 C++ 中处理大整数。 首先,我们将讨论 C++ 中的原始整数类型及其范围,然后讨论如何处理大于原始整数类型限制的整数。C++ 中的整数数据类型

在 C++ 中使用 128 位整数

发布时间:2023/09/02 浏览次数:170 分类:C++

在本文中,我们将讨论 C++ 中的 128 位整数。 我们还将了解为什么需要它以及 C++ 中可能的替代方案。

C++ 井字棋游戏

发布时间:2023/09/02 浏览次数:107 分类:C++

本文将讨论使用 C++ 中的条件语句和循环创建 tic tac toe 游戏。C++ 井字棋游戏

C++ 中的默认构造函数和 default 关键字

发布时间:2023/09/02 浏览次数:127 分类:C++

本文讨论 C++ 中的默认构造函数以及新引入的关键字 default。首先,让我们了解一下C++中的默认构造函数。 默认构造函数是一种特殊的构造函数,它没有参数,用于为类的数据成员设置默认值。

C++ 中的空构造函数

发布时间:2023/09/02 浏览次数:165 分类:C++

C++ 中的空构造函数是一种不执行任何操作的特殊类型构造函数。 编译器知道没有代码可以执行,因此不会为构造函数生成任何可执行代码。

C++ 中的结构体构造函数

发布时间:2023/09/02 浏览次数:74 分类:C++

这篇文章将讨论 struct 的使用以及使用 C++ 添加构造函数。C++结构体简介 struct 代表结构,是组合了一些基本类型变量的用户定义数据类型。 这些变量混合起来形成一个新的单元。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便