c++ lambda的匿名特性,无法直接在lambda内部递归调用自身。
借助std::function,这是一个可调用对象包装器,可以容纳除了类成员函数指针以外所有的可调用对象,适合作为回调函数使用。

Leetcode 47 全排列II
题目:
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

第一种写法,直接用function包装,lambda通过[&]捕获引用,进而实现递归调用,缺点就是这种写法一定要有个返回值类型,对于void要改成返回bool。

class Solution {public:vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ans;vector<int> temp(nums.size());bitset<8> b;std::function<bool()> DFS = [&]()->bool {int index = b.count();for (size_t i = 0; i < nums.size(); i++) {if (!b[i]) {if (i && !b[i - 1] && nums[i] == nums[i - 1]) {continue;}temp[index] = nums[i];if (index + 1 == nums.size())ans.push_back(temp);else {b[i] = true;DFS();}b[i] = false;}}return false;};DFS();ans.shrink_to_fit();return ans;}
};

第二种,把lambda函数在外部用function包装,在调用lambda时把新函数作为参数传入(给冰箱起个别名“大象”,然后把“大象”装进冰箱里)

class Solution {public:vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ans;vector<int> temp(nums.size());bitset<8> b;auto dfs = [&](auto&& me)->void {int index = b.count();for (size_t i = 0; i < nums.size(); i++) {if (!b[i]) {if (i && !b[i - 1] && nums[i] == nums[i - 1]) {continue;}temp[index] = nums[i];if (index + 1 == nums.size())ans.push_back(temp);else {b[i] = true;me(me);}b[i] = false;}}};// 包装std::function<void(decltype(dfs))> DFS = dfs;// 作为参数传入DFS(dfs);ans.shrink_to_fit();return ans;}
};

C++ lambda递归相关推荐

  1. php 匿名函数 递归,匿名函数,lambda_C++ lambda 递归调用,匿名函数,lambda,c++ - phpStudy...

    C++ lambda 递归调用 自己敲的一个归并排序,C++11 #include #include using namespace std; template void merge_sort(T l ...

  2. C++11新宠-Lambda函数学习

    Lambda背景 Lambda来自lambda calculus(λ演算,如果有兴趣,可以看这篇文章http://cgnail.github.io/academic/lambda-1/)--一种定义和 ...

  3. C++ 11基本语法及基本算法

    文章目录 1. c++关键字 1.1 const_cast.dynamic_cast.reinterpret_cast.static_cast 1.1.1 const_cast 1.1.2 dynam ...

  4. 讨论JAVA和QT之争

    这是两种以跨平台为特色的开发方式.Qt更多被认为是一种框架,但是Qt中有新增一些C++所没有的语法,所以也可以认为是一种编程语言.Java被认为是一种编程语言,但是很多人并不知道JAVA的编程语言其实 ...

  5. Python3 图片隐写术

    Python3 图片隐写术 一.实验简介 wikipedia 关于隐写术的介绍: 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容 ...

  6. 编写递归调用的Lambda表达式

    前段时间,我写一个树的访问算法的时候,用了Visitor模式把访问的算法分离了出来,当时打算用lambda表达式写visit算法的,却发现带递归调用的lambda表达式没想象的那么好写,憋了半天愣是没 ...

  7. python学习-综合练习六(列表翻转、变量交换、复制列表、元素求和(lambda和递归)、字典排序、字典pop)

    文章目录 列表翻转 变量交换 复制列表 元素求和 字典排序 字典pop 说明:本篇博文的知识点大部分来自 Python3 实例 列表翻转 列表翻转就是把列表的值按顺序左移,逻辑还是挺简单的. 我之前的 ...

  8. foreach jdk8 递归_[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .

    递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可 ...

  9. node python复用代码_python-代码复用(函数、lambda、递归、PyInstaller库)

    一.函数 1.函数定义 def  函数名(参数列表): 2.返回值 return 返回值可以有多个,其实是返回一个tuple ##多个返回值 def sumDiff(x,y): return x+y, ...

最新文章

  1. 2015年,戴尔存储如何助力“智慧视频”落地?
  2. 【物联网】 AR9344开发环境的搭建和编译固件
  3. 《数据库SQL实战》查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
  4. 我的Android进阶之旅------Android利用温度传感器实现带动画效果的电子温度计
  5. imx6q 开发android,SAIL-IMX6Q ANDROID开发环境搭建与系统编译
  6. select poll epoll
  7. Python选修课第二届Turtle绘图大赛
  8. 自动驾驶算法-滤波器系列(五)——高级运动模型在UKF中的应用
  9. CF547D Mike and Fish 建图
  10. mysql高级管理-note
  11. java 中float所占字节_Java语言中,float类型所占存储空间为【】个字节
  12. Android学习之文本编辑控件的使用
  13. 【矩阵乘法】外部矩阵乘法
  14. 当前上下文中不存在名称 ViewBag
  15. Matlab学习1-图像处理灰度
  16. 企业微信PC版多开软件,测试win10有效
  17. 如何离线查看DAT卫星影像?
  18. 蘑菇街php面试,蘑菇街面试
  19. mysq根据首字母模糊检索,拼音首字母模糊查询名称
  20. 哎哟,不错哦之玩乐动物园

热门文章

  1. 人生感悟:他们这样爬出烂泥般的人生
  2. 调功器PA400X系列选型+个人理解
  3. js一键批量打印_web页面的单页打印以及批量打印实现方法
  4. 六派玩家收割智能路由器
  5. 微前端 Micro-Frontends - 概念
  6. mysql主从数据一致性问题及MHA和MGR的架构及底层原理
  7. 03-Java核心类库_XML与JSON
  8. C语言Dialogbox添加图片,dialogbox_传奇服务端CloseBigDialogBox是什么意思
  9. MP4/MP3解封装ffmpeg(十三)
  10. 网不好,看个漫画加载半天?教你用Python批量下载网站所有漫画(附源码和视频教程)