C++ lambda表达式函数递归调用简单写法实现

在C++11中,lambda表达式函数递归往往会带上<functional>头文件。书写形式如下:

c++ 复制代码
    function<int(int)> fib = [&fib] (int n) {
        if(n <= 2) return 1;
        else return fib(n-1) + fib(n-2);
    };
	cout<<fib(5);

还有相对简单点的第二种写法(C++14):

c++ 复制代码
    auto fib = [](auto && fib, int n)  -> int {
        if(n <= 2) return 1;
        else return fib(fib, n - 1) + fib(fib, n - 2);
    };
    cout<<fib(fib,5);

对于第二种,auto && fib的作用是为了在 lambda 表达式内部能够递归调用自身。在 C++14 中,lambda 表达式默认是无法直接递归调用的,因为在 lambda 内部无法访问到自身的定义。

使用 auto &&fib 的方式,实际上是将递归函数对象传递给 lambda 表达式本身,通过递归调用传递进来的函数对象来实现递归。

具体原理是这样的:

  1. auto &&fib 定义了一个右值引用类型的函数对象,这个函数对象被称为 fib
  2. 在 lambda 表达式内部,fib 可以被直接调用,因为它是一个函数对象。
  3. 在递归调用时,fib 会被传递给自身,从而完成对自身的递归调用。

这种技巧可以绕过对 lambda 表达式递归调用的限制,实现了在 lambda 表达式内部递归调用自身的需求。

(7条消息) C++ 实现lambda递归调用(C++11 - C++23)_c++ lambda 递归_J__M__C的博客-CSDN博客

chatGPT

相关推荐
leonkay23 分钟前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发
harmful_sheep32 分钟前
java group by常见用法
java·开发语言·python
SKH.38 分钟前
Linux软件编程(6)线程间通信
java·开发语言·数据库
whcyhhh1 小时前
头歌实践教学平台:数据科学与大数据技术导论(十六)
大数据·开发语言·python
萌动的小火苗1 小时前
数据结构面试题【无答案】
c语言·开发语言·数据结构·链表
宸津-代码粉碎机1 小时前
AI工程化高阶实战|从Demo到生产落地核心架构、全套源码与避坑指南
java·大数据·开发语言·人工智能·python·架构
XR1234567882 小时前
办公网自主创新建设怎么选?信创办公场景的选型逻辑
开发语言·php
郝学胜-神的一滴2 小时前
Effective Python 条款4:字符串格式化大乱斗
开发语言·网络·python·程序人生·软件工程
Ramble_Naylor2 小时前
只借不占:Rust 的引用与借用
开发语言·rust
FreeTinker3 小时前
Java文件服务器的技术选型与实现路径:从嵌入式工具到企业级系统
java·服务器·开发语言