c# 用非递归的写法实现递归
最近写代码碰到了一个bug,就是递归次数太多爆堆栈了,然后就写了一个递归工具来解决这个问题。
using System;
using System.Collections.Generic;/// <summary>
/// 递归工具
/// </summary>
public static class RecursionTool
{//递归方式 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/// <summary>/// 树节点接口/// </summary>public interface ITreeNode{/// <summary>/// 访问标记/// </summary>bool Visited { get; set; }/// <summary>/// 子节点/// </summary>List<ITreeNode> Children { get; set; }}/// <summary>/// 递归算法的非递归实现/// 以节点树的方式递归/// </summary>public static (bool result, object args) Recursive(IEnumerable<ITreeNode> rootNodes,Func<ITreeNode, (bool result, object args)> handleNode){var stack = new Stack<ITreeNode>();foreach (var item in rootNodes){item.Visited = false;stack.Push(item);}while (stack.Count > 0){var rootNode = stack.Peek();//没访问过,且有子节点时if (rootNode.Visited == false && rootNode.Children != null && rootNode.Children.Count > 0){rootNode.Visited = true;//把子节点全部入栈foreach (var item in rootNode.Children){item.Visited = false;stack.Push(item);}}//访问处理根节点else{rootNode = stack.Pop();rootNode.Visited = false;if (handleNode != null){var tuple = handleNode(rootNode);if (tuple.result){return tuple;}}}}return (false, null);}//递归方式 2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/// <summary>/// 递归状态/// </summary>public enum ERecursiveState{Finish,Next,Skip,}/// <summary>/// 递归算法的非递归实现/// 根据回调里的逻辑递归/// </summary>public static (bool result, object args) Recursive<TNode>(IEnumerable<TNode> rootNodes,Func<TNode, (ERecursiveState state, bool result, object args, IEnumerable<TNode> nexts)> handleNode){var stack = new Stack<TNode>();foreach (var item in rootNodes){stack.Push(item);}while (stack.Count > 0){var rootNode = stack.Pop();if (handleNode != null){var tuple = handleNode(rootNode);switch (tuple.state){case ERecursiveState.Finish:return (tuple.result, tuple.args);case ERecursiveState.Next:{if (tuple.nexts != null){foreach (var item in tuple.nexts){stack.Push(item);}}}break;}}}return (false, null);}}
也很久没写文章了,顺手记录一下。
相关文章:
c# 用非递归的写法实现递归
最近写代码碰到了一个bug,就是递归次数太多爆堆栈了,然后就写了一个递归工具来解决这个问题。 using System; using System.Collections.Generic;/// <summary> /// 递归工具 /// </summary> public static class RecursionTool {//递归方式…...
nginx之location的优先级和nginx的重定向
一、nginx之location的优先级和匹配方式(重点) (一)nginx的正则表达式 nginx的正则表达式 符号 含义 ^ 字符串的起始位置(以什么开头) $ 字符串的结束位置(以什么结尾) * 匹…...
【计算机网络】——前言计算机网络发展的历程概述
主页点击直达:个人主页 我的小仓库:代码仓库 C语言偷着笑:C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法:算法专栏 C头…...
eventfd
1. #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags); //创建eventfd 参数含义: initval:创建eventfd时它所对应的64位计数器的初始值; flags:eventfd文件描述符的标志,可由三种选项组…...
BES耳机空间音频技术实现
BES耳机空间音频技术实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?加我微信hezkz17, 本群提供音频技术答疑服务 音响和耳机在空间音频技术上实现方式是不同的 虚拟现实可谓是空间音频技术最具代表性的应 用领域。虽然虚拟现实的起源可以追溯到1 9 6 8年, …...
day27--AJAX(bootstrap之modal,toast;接口文档的一些用法;AJAX原理)
目录 Bootstrap之Modal: 显示和隐藏方法 通过自定义属性: 使用JS来控制弹框: Bootstrap之Toast: 接口文档一些用法: 删除图书: 图片上传: 图片上传步骤: 修改头像…...
【ArcGIS Pro二次开发】(70):杂七杂八的记录
本文用于记录一些使用频率较高但归类繁杂,非系统性的一些代码。 主要方便自己使用和查阅,随时更新。 1、从GDB数据库中打开【FeatureDataset\FeatureClass\Table】 using Geodatabase gdb new Geodatabase(new FileGeodatabaseConnectionPath(new Uri…...
竞赛选题 深度学习 机器视觉 人脸识别系统 - opencv python
文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 人脸识别系统 该项目…...
【工具】SSH端口转发管理器,专门管理SSH Port Forwarding
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 开源代码看这里:http://xfxuezhang.cn/index.php/archives/1151/ 背景介绍 有时候需要用到ssh的端口转发功能。目前来说,要么是cmd里手敲指令,但每次敲也太麻烦了;或…...
opencv-phase 函数
计算梯度强度和方向 梯度的方向与边缘的方向总是垂直的。图像中的边缘可以指向各个方向,通常会取水平(左、右)、垂直(上、下)、对角线(左上、右上、左下、右下)等八个不同的方向计算梯度。 角度…...
44.ES
一、ES。 (1)es概念。 (1.1)什么是es。 (1.2)es的发展。 es是基于lucene写的。 (1.3)总结。 es是基于lucene写的。 (2)倒排索引。 (3…...
分权分域有啥内容?
目前的系统有什么问题? 现在我们的系统越来越庞大,可是每一个人进来的查看到的内容完全一样,没有办法灵活的根据不同用户展示不同的数据 例如我们有一个系统,期望不同权限的用户可以看到不同类型的页面,同一个页面不…...
6.Docker搭建RabbitMQ
1、端口开放 如果在云服务上部署需在安全组开通一下端口:15672、5672、25672、61613、1883。 15672(UI页面通信口)、5672(client端通信口)、25672(server间内部通信口)、61613(stomp 消息传输)、1883(MQTT消息队列遥测传输)。 2、安装镜像 docker pull rabbitmq 3、…...
用 docker 创建 jmeter 容器, 实现性能测试,该如何下手?
用 docker 创建 jmeter 容器, 实现性能测试 我们都知道,jmeter可以做接口测试,也可以用于性能测试,现在企业中性能测试也大多使用jmeter。docker是最近这些年流行起来的容器部署工具,可以创建一个容器,然后把项目放到…...
4年软件测试,突破不了20K,太卷了。。。
先说一个插曲:上个月我有同学在深圳被裁员了,和我一样都是软件测试,不过他是平安外包,所以整个组都撤了,他工资和我差不多都是14K。 现在IT互联网已经比较寒冬,特别是软件测试,裁员先裁测试&am…...
机器人控制算法——两轮差速驱动运动模型
1.Introduction 本文主要介绍针对于两轮差速模型的逆运动学数学推导。因为在机器人控制领域,决策规划控制层给执行器输出的控制指令v(车辆前进速度)和w(角速度),因此,我们比较关心,当底层两个驱动电机接收到此信息,如何…...
Queue简介
概念: 队列(Queue)是一种常见的线性数据结构,在Java中用于存储和操作元素序列。它基于先进先出(First-In-First-Out, FIFO)原则,即最早入队的元素首先出队。只能在队尾添加元素,在队…...
被面试官问到分布式ID,别再傻乎乎只会答雪花算法了...
文章目录 1. 分布式ID2. 数据库主键自增3. 数据库号段模式4. Redis自增5. UUID6. Snowflake (雪花算法)7. Leaf (美团分布式ID生成系统)7.1 Leaf-segment 号段方案7.1.2 双buffer优化 7.2 Leaf-snowflake方案7.3 Leaf-snowflake Demo 1. 分布式ID 在分布式系统中,通…...
使用Boto3访问AWS S3服务
安装Boto3,执行如下命令: python -m venv .venv . .venv/bin/activate python -m pip install boto3创建配置文件,执行如下命令: mkdir -p ~/.aws touch ~/.aws/credentials touch ~/.aws/config编辑 ~/.aws/credentials&#x…...
ODrive移植keil(五)—— 开环控制和电流变换
目录 一、开环控制1.1、控制原理1.2、硬件接线1.3、代码说明1.4、程序演示1.5、程序架构的体现 二、电流变换2.1、理论说明2.2、代码说明 ODrive、VESC和SimpleFOC 教程链接汇总:请点击 一、开环控制 在SimpleFOC系列中有开环控制的教程,SimpleFOC移植S…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
