当前位置: 首页 > news >正文

匿名递归与不动点组合子

 
先贴上 CS61A Homework 3 Recursion, Tree Recursion 中的最后一道思考题题面:

​Q6: Anonymous Factorial

This question demonstrates that it's possible to write recursive functions without assigning them a name in the global frame.

The recursive factorial function can be written as a single expression by using a conditional expression.

>>> fact = lambda k: 1 if k == 1 else mul(k, fact(k - 1))
>>> fact(5)
120

However, this implementation relies on the fact (no pun intended) that fact has a name, to which we refer in the body of fact. To write a recursive function, we have always given it a name using a def or assignment statement so that we can refer to the function within its own body. In this question, your job is to define fact recursively without giving it a name!

Write an expression that computes n factorial using only call expressions, conditional expressions, and lambda expressions (no assignment or def statements).

Note: You are not allowed to use make_anonymous_factorial in your return expression.

The sub and mul functions from the operator module are the only built-in functions required to solve this problem.

def make_anonymous_factorial():
    """Return the value of an expression that computes factorial.
    >>> make_anonymous_factorial()(5)
    120
    >>> from construct_check import check
    >>> # ban any assignments or recursion
    >>> check(HW_SOURCE_FILE, 'make_anonymous_factorial',
    ...     ['Assign', 'AnnAssign', 'AugAssign', 'NamedExpr', 'FunctionDef', 'Recursion'])
    True
    """
    return 'YOUR_EXPRESSION_HERE'

 

答案代码

def make_anonymous_factorial():
    return (lambda f: lambda k: f(f, k))(lambda f, k: k if k == 1 else mul(k, f(f, k - 1)))

 

思路

注意:对本文 python 代码的验证,别忘了 from operator import mul

我们以

fact = lambda k: 1 if k == 1 else mul(k, fact(k - 1))

作为基础进行修改

题目要求不能使用赋值和 def 定义,这意味着不能在全局框架中增加新的函数绑定,然而,必须使用递归实现,这意味着必须在函数中调用自身——如果要进行函数调用,则必须使用函数的名称,这是不可避免的。

通过上述分析,可以知道,为了在递归调用时能够指称函数,我们不得不使用由 lambda 函数绑定的形式参数,因此,一个基本的框架是:

lambda f: ...

这样一来,就能通过名称 f 来递归调用了!

让我们把这个框架与原先的基础代码(随意地,漫无目的地)结合起来:

lambda f: lambda k: 1 if k == 1 else mul(k, f(k - 1))

现在,这个表达式起到的作用是接受一个函数 f ,转换成这样一个函数:如果参数是 \(1\) ,则输出 \(1\),否则输出 \(k * f (k - 1)\)

然而,这和目标有着很大的差距!如果要直接使用这个匿名高阶函数,无论将它应用于什么函数 h,都是不可行的:假设可行,由于 h 以一个整数 n 作为唯一参数, 且返回一个整数,我们会发现这个匿名高阶函数并未将其转化为一个递归过程,而是最多将 h(3) 转换为 h(2) 就停止了

我们考虑一个关于信息的小问题:可以观察到,我们辛辛苦苦用 lambda 函数绑定的名称 f, 在“递归”一次后就丢失了,那么显然不能继续递归了

如何不让这一信息丢失?当然是把这一信息作为参数代代相传!

因此,我们把 f 修改为一个双参数函数,多出来的一个参数是 f 本身,对代码略作修改(有两处地方需要同时修改):

lambda f, k: 1 if k == 1 else mul(k, f(f, k - 1))

几乎快完成了!能够惊喜地发现,在解决信息传递问题的同时,顺带着也实现了递归!设想我们计算 \(f (f, 5)\),结果是 \(5 * f (f, 4)\),也就是 \(5 * 4 * f (f, 3)\) ... 这就成功了。

唯一的问题是:这个过程没办法开始,如果要这样开始第一次计算,就需要传入参数 f, n,而 f 此时还没有定义。

考虑希望达到的效果:输入 n, 输出 n 的阶乘。我们必须把输入缩减到一个变量,这既是为了避免计算过程无法开始的困难,也是业务本身的要求,因此,我们通过一个高阶函数来构造一个计算的入口:

(lambda f: lambda k: f(f, k))

将这个入口应用于核心函数:

(lambda f: lambda k: f(f, k))(lambda f, k: 1 if k == 1 else mul(k, f(f, k - 1)))

这就完成了整道题目!


继续前进(写于 2025.9.15)

python 的 lambda 表达式和 Untyped lambda calculus 的一个不同点是:python 支持多参数的 lambda 函数,然而,正如上文那样,使用多参数的 lambda 函数会导致不能科里化,妨碍化简为更简单的形式。

因此,将上面的答案改为使用单参数函数的版本:

(lambda f: lambda k: f(f)(k))(lambda f: lambda k: 1 if k == 1 else mul(k, f(f)(k - 1)))

现在可以用科里化进行化简:

(lambda f: f(f))(lambda f: lambda k: 1 if k == 1 else mul(k, f(f)(k - 1)))

回忆一下,我们是从 “把这个框架与原先的基础代码(随意地,漫无目的地)结合起来” 开始的:

g = lambda f: lambda k: 1 if k == 1 else mul(k, f(k - 1))

接下来,我们进行的只不过是一个机械的,可重复的过程:让 f 接受自己为参数。刚刚,我们手动进行了变更,得到了答案,那么能不能自动化呢?把转换过程视为一个应用过程,我们只需要下面这个将高阶函数 fix 应用于 g

fix = lambda g: (lambda f: f(f)) (lambda f:  g(f(f)))

如果进行一步 \(\beta\) 规约,那么可以得到 Y 组合子的常见形式:

fix = lambda g: (lambda f:  g(f(f)))(lambda f:  g(f(f)))

那么我们期望 fix(g)(4) 的结果是 \(24\)

但是,实际上爆栈了,怎么会事呢?

是因为 python 的求值策略是 call-by-value!在进行 \(\beta\) 规约前,必须先把右半部分规约到值(value)

等等,什么是值?需要补充一下 lambda-calculus 的基础知识:

\[\begin{array}{rcll} t &::= \\ & & x \\& & \lambda x.\,t & \\& & t \; t & \\ \end{array} \qquad \begin{array}{l} \text{terms:} \\ \textit{variable} \\ \textit{abstraction} \\ \textit{application} \end{array} \]

在这里,abstraction 就是值,而 variable 和 application 不是

下面这段代码这是可求值到底的:

(lambda f: f(f))(lambda f: lambda k: 1 if k == 1 else mul(k, f(f)(k - 1)))(4)

求值过程:

G = (lambda f: lambda k: 1 if k == 1 else mul(k, f(f)(k - 1)))(lambda f: f(f))(G)(4)
= G(G)(4)
= (lambda k: 1 if k == 1 else mul(k, G(G)(k - 1)))(4)
= 1 if 4 == 1 else mul(4, G(G)(4 - 1)))
= mul(4, G(G)(3)))
= ...
= 4 * (3 * (2 * G(G)(1)))
= 4 * (3 * (2 * 1))
= 24

但下面的就不行了:

g = lambda f: lambda k: 1 if k == 1 else mul(k, f(k - 1))
H = (lambda f:  g(f(f)))
fix = lambda g: H(H)fix(g)(4)

展开:

fix(g)(4)
= H(H)(4)

按照设计 fix 时的思考,H 就是 G,所以应该这样继续:

= G(G)(4)
= ...
= 24

但这需要先将 H,也就是 lambda f: g(f(f)) 规约到 G,这在 call-by-value 求值策略是不可行的,甚至在更宽松的 call-by-name 就不行,因为它试图在 abstraction 内部规约。

实际上会这样继续:

fix(g)(4)
= H(H)(4)
= (lambda f:  g(f(f))) (lambda f:  g(f(f)))(4)
= g((lambda f:  g(f(f)))(lambda f:  g(f(f))))(4)
= g(g((lambda f:  g(f(f)))(lambda f:  g(f(f)))))(4)
= g(g(g((lambda f:  g(f(f)))(lambda f:  g(f(f))))))(4)
= ...

这就是失败的原因!

最后,来看一看它在 call-by-name 求值策略中的表现:此时不能在 abstraction 内部规约,但是能在右边部分不是值时规约:

fix(g)(4)
= H(H)(4)
= g(H(H))(4)
= (lambda f: lambda k: 1 if k == 1 else mul(k, f(k - 1)))(H(H)(H(H)))(4)
= (lambda k: 1 if k == 1 else mul(k, (H(H)(H(H)))(k - 1)))(4)
= 1 if 4 == 1 else mul(4, (H(H)(H(H)))(4 - 1))
= mul(4, (H(H)(H(H)))(3))
= ...
= 24

Magic! 这个故事告诉我们,退一步海阔天空!

终点站

我们还能拯救美好的幻想吗?能否定义一个更好的 fix 来规避求值顺序问题?

问题的本质在于,项 f(f) 是 application,不是值,call-by-value 会试图规约这个部分来试图让它化简成值。只需要把它包装为 abstraction 即可!

为了保持含义不变,具体方法是将 f(f) 替换为 lambda x: f(f)(x),这个技巧叫 \(\eta\) - 展开(eta-expansion)

g = lambda f: lambda k: 1 if k == 1 else mul(k, f(k - 1))
M = (lambda f: g(lambda x: f(f)(x)))
fix2 = lambda g: M(M)fix2(g)(4)
= M(M)(4)
= g(lambda x: M(M)(x))(4)
= (lambda f: lambda k: 1 if k == 1 else mul(k, f(k - 1)))(lambda x: M(M)(x))(4)
= (lambda k: 1 if k == 1 else mul(k, (lambda x: M(M)(x))(k - 1)))(4)
= mul(4, (lambda x: M(M)(x))(3))
= 4 * M(M)(3)
= ...
= 4 * (3 * (2 * M(M)(1)))
= 24

成功了!最后,fix2 就是 Z 组合子!

来看看 TAPL 中的 Z 组合子定义:

\[fix = \lambda f.\ (\lambda x.\ f\ (\lambda y.\ x\ x\ y))\ (\lambda x.\ f\ (\lambda y.\ x\ x\ y)) \]

把函数的形式变量命名为 \(x\),令人费解啊!

相关文章:

匿名递归与不动点组合子

先贴上 CS61A Homework 3 Recursion, Tree Recursion 中的最后一道思考题题面: ​Q6: Anonymous FactorialThis question demonstrates that its possible to write recursive functions without assigning them a name in the global frame.The recursive factorial function…...

Markdown学习Day01

Markdown学习第一天 【【狂神说Java】Java零基础学习视频通俗易懂】https://www.bilibili.com/video/BV12J41137hu?p=6&vd_source=e3ba980d960d7d6c98e4872bba8cf225 Markdown学习 二级标题 字体 her hus hou KLI 引用选择不需要辩护。分割线插图超链接 学Java 表格年级 班…...

flutter compass结构代码分析

1.config文件夹:1.1assets.dart返回一个Assets类,包含activities和destinations两个静态属性。两个静态属性分别代表虚拟数据存放的路径。在assets文件夹下1.2 dependencies.dart使用provider绑定远程访问和本地访问所需要的数据 2.data文件夹2.1 repositoriesactivity文件夹a…...

25.9.15

应该都知道我退役了吧。 我对于这一段竞赛生涯呢,情感太复杂了。 (话说退役半年才回来写是不是有点晚了) 怎么说呢,这段竞赛让我有了一段快乐的时光,也让我彻底改变了。 想说很多,但是又说不出口。 先说说坏处吧 我的抑郁症可以说是被竞赛加深的,以至于我在初三下和高一…...

二十八、共享内存多处理器的基本概念

目录1. 核心定义2. 两种主要的共享内存架构a) 均匀内存访问b) 非均匀内存访问3. 共享内存多处理器的核心挑战与解决方案a) 缓存一致性b) 内存一致性4. 编程模型与同步5. 优势与劣势优势:劣势:总结共享内存多处理器是多处理器系统中最常见和直观的一种架构,也是现代多核CPU设…...

详细介绍:【ARMv7】系统复位上电后的程序执行过程

详细介绍:【ARMv7】系统复位上电后的程序执行过程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospac…...

C#高级语法

https://www.cnblogs.com/NotEnough/p/7426853.html https://juejin.cn/post/7100033147101773831...

配置Maven

IDEA配置Maven原文链接:https://blog.csdn.net/leah126/article/details/132020904 一、Maven下载 首先我们进入maven官方网站,进入网页后,点击Download去下载。下载免安装版,解压即可,解压至磁盘任意目录,尽量不要取中文名如下图: 二、配置Maven环境变量 打开cmd命令行,…...

那两年的回忆录

小引 我的OI之路是短暂且波折的,像是一则故事,曲曲折折,却又很是有趣,或许那两年是我最愉快的时光吧。 我总是问自己当初为什么要学OI,许是一腔热血,许是奔赴热爱。仔细想想,从最开始接触scratch,到后来的Python,最后的C++,前面两个都是觉得好玩,觉得有趣,可C++呢,…...

DDR4基本介绍

DDR4简介 DRAM的存储原理 DRAM的基本存储单元:cell 一个cell由一个晶体管和一个电容(约为30pF)组成,电容存储了电量代表1,电容放空电量代表0,晶体管作为电容的充放电开关,以便实现1bit数据的读写,cell的结构如下图所示 :读的过程:首先打开MOS管,根据电容的充放电信息…...

网络同步预测-Prediction

预测(Prediction) 是解决网络延迟问题、提升玩家操作流畅度的核心机制客户端接收玩家输入玩家操作(如 WASD 移动、跳跃)被捕获为输入事件(FInputActionValue)。客户端本地预测执行客户端不等服务器响应,直接基于输入在本地模拟角色行为(如移动、动画播放),并立即更新…...

二十五、多处理器的基本概念 (SISD/SIMD/MIMD)

目录1. SISD - 单指令流单数据流2. SIMD - 单指令流多数据流3. MIMD - 多指令流多数据流总结与对比简单类比多处理器体系结构中的三个基本概念:SISD、SIMD 和 MIMD,这些概念由迈克尔弗林(Michael Flynn)于1966年提出,被称为弗林分类法(Flynns Taxonomy)。它根据指令流(…...

java课堂问题2

1.1changeStr(String x):方法内部尝试将传入的字符串参数重新赋值为 "xyz",但该操作仅在方法内部有效,不会影响外部实参 changeArr(String[] strs):遍历传入的字符串数组,对数组中的每个元素进行修改,在原字符串后拼接其索引值(例如将第 0 个元素改为 "原…...

集训总结(六)

9.15 听 CEO 讲了 sb 树,不知道该写什么,挂个祂博客的链接吧。 https://www.cnblogs.com/Augenstern-/p/18964066...

GAS_Aura-Prediction GAS

1讲了关于GAS中的网络之间,Client-Server的网络同步时,需要使用预测...

PromptPilot 产品发布:火山引擎助力AI提示词优化的新利器

周六非常荣幸参加了火山引擎官方举办的PromptPilot产品发布会。其实早在8月份,我就有幸参与了该产品的内测阶段,并撰写了一些体验心得和感受。此次发布会当天,不仅深入聆听到了产品负责人以及工程师们对PromptPilot的全新解读和详细介绍,还现场感受到了他们对产品未来发展方…...

安装window版本docker

下载 下载链接:https://hub.docker.com/?overlay=onboarding 在 Windows 上部署 Docker 的方法都是先安装一个虚拟机,VMware版本17.0以上可以兼容安装docker 另一个可以下载 Hyper-V,Hyper-V 是微软开发的虚拟机,类似于 VMWare 或 VirtualBox 选中Hyper-V 也可以通过命令…...

已严肃完成今日特征多项式大学习

何为特征值与特征向量 古人云:特征向量,乃方阵与线性变换之特征也。 盖线性变换,千变万化,寻不变其所向之向量,乃特征向量也。注意 0 向量不是特征向量。 何为特征值?线性变换中特征向量的伸长倍数,称该特征向量属于该特征值。 容易知道与一个特征向量共线的向量均为特征…...

docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式 - 实践

docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...

python_Day21_mysql(2)

今日内容大纲介绍约束详解单表约束 多表约束DQL语句详解简单查询 条件查询 聚合查询 分组查询 排序查询 模糊查询 分页查询多表查询交叉连接 连接查询 子查询 自关联(自连接)查询扩展: 多表建表一对多 多对多 一对一1.主键约束详解 /* 约束详解:概述:SQL中的约束分为: 单表约束…...

.zip用法

.zip() 函数在 Python 中是一个非常实用的内置函数,它用于将多个可迭代对象(比如列表、元组等)中的元素打包成一个元组的迭代器。 简单来说,它的作用就是把不同序列中对应位置的元素配对,就像拉链一样把两排牙齿咬合在一起。 zip() 的基本用法 zip(iterable1, iterable2, …...

vue2使用pnpm编译打包时的错误处理

1. 错误信息 error in ./src/views/forest/forestGateway.vue?vue&type=script&lang=js Module parse failed: Unexpected token (203:39) File was processed with these loaders: * ./node_modules/.pnpm/**cache-loader**@4.1.0_webpack@4.47.0/node_modules/cach…...

中南上课第一天

一周三天早八,体验衡中生活:( 早上起来就发现食堂的人巨多,一看原来是崩铁和瑞幸联名了,看来学校崩p还是挺多的,我看到有卖油条和豆浆的,于是浅尝了一下——还是避雷吧,油条油的要死,吃了一根第二根实在是咽不下去了,于是扔了去教室,如图,不愧是知名的电动车帝国,这…...

二十四、深入理解CPU控制信号的最终使命

目录指挥官与士兵:深入理解CPU控制信号的最终使命一、舞台与演员:认识数据通路中的角色二、核心命题:为什么说控制信号“仅”作用在功能部件上?三、澄清误区:那流水线寄存器呢?四、更深层的意义:理解计算机架构的哲学结论指挥官与士兵:深入理解CPU控制信号的最终使命 在…...

20250915 - 状压dp 总结

比赛链接:https://vjudge.net/contest/748191。 A - 互不侵犯 最最最最最最最板子的状压 DP。 大概就是一行一行去弄。然后的话,DP 维护三个量,当前遍历到第 \(i\) 行,目前总共放了 \(j\) 个国王,以及这一行的放置国王情况为 \(st\)(用二进制状压表示)。判断的时候,有一…...

PS2025安装包永久免费版下载安装教程Photoshop 2025 v26.0安装包永久免费版下载

身边很多朋友问我怎么装 PS 2025,其实步骤不难,先跟大家说下这软件到底好用在哪,再一步步教安装,最后给几个常用的实操案例,新手跟着做就能上手,不管是想做摄影后期、商业设计,还是社交账号配图,看完这篇 Photoshop 2025 v26.0 下载安装教程都能搞定。目录一、先搞懂 P…...

学校真是太棒了

我的学校是全世界最好的学校,不接受反驳!学校太好了 作为学生评判学校自然要说点实际的。 就比如说住宿环境,那是我见过的最优秀的宿舍了。 你们学校会把宿舍改装成水帘洞吗 今天中午回到宿舍就发现学校为了让我们更加凉爽,同时赏心悦目,将宿舍改装成水帘洞,一进宿舍楼就…...

如果远程玩家过早结束异步任务,并且具有该集的任务仍在运行,则该任务被杀死-SetWaitingOnRemotePlayerData()

SetWaitingOnRemotePlayerData主要用于控制游戏模式是否等待远程玩家(通常是网络多人游戏中的客户端)的数据加载完成。调用时,可以直接杀死该使用数据的任务...

9.15日总结

完成hbase的部署,需要准备虚拟机并部署hadoop与java环境。途中虚拟机磁盘满了还要重新分配一下,但奈何磁盘满了进不去桌面,把之前的docker删了总算顺利进去了。...

二十二、流水线CPU的神经脉络:详解控制信号的产生、保存与传递

目录一、核心挑战:多指令的并行交响曲二、解决方案:提前生成与“随指令流动”1. 产生:在译码阶段(ID)一次性生成所有“说明书”2. 保存与传递:流水段寄存器——控制信号的“护航舰队”三、这种机制的优势与意义总结你是否曾好奇,现代CPU的流水线如同一条高效运转的装配线…...

python_Day20_mysql(1)

今日内容大纲介绍数据库的相关概述 环境搭建 SQL语句分类DDL DML DCL DQLDDL语句之操作数据库 DDL语句之操作数据表 DML语句之操作表数据(增删改) DQL语句之操作表数据(查)1.数据库的相关概述问1: 你知道的存储数据的方式有哪些? -- 方式1: 变量, 列表, 字典... 只能对数据临时…...

确定调用 TargetData是否已发送-CallReplicatedTargetDataDelegatesIfSet()

example:const bool bCalledDelegate = AbilitySystemComponent.Get()->CallReplicatedTargetDataDelegatesIfSet(SpecHandle, ActivationPredictionKey);if (!bCalledDelegate){ SetWaitingOnRemotePlayerData();}...

二十三、流水线的起点为何无需指挥?深入理解IF与ID这两个“公共流水段”

目录一、时钟:流水线的同步心跳二、公共流水段:为何IF和ID无需“特殊关照”1. 取指阶段(IF):无差别的读取2. 译码阶段(ID):标准化的解析三、控制信号的诞生:时机决定一切四、控制信号为谁而生?总结:标准化与个性化的分工在我们深入探索CPU流水线的精妙世界时,一个看…...

来解剖 来平息你的颤抖 叫嚷着还不足够 还需要更多疼痛 才值得温柔

test4 不要在意这个诡异的标题。排序sort 快排的过程相当于以 \(a_r\) 为界限,更小的放到左边,更大的放在右边,我们还关心新的 \(a_r\) 是谁,左边是按顺序的填入,右边新的顺序只跟原本的顺序有关系素排列双射下去啦,所以就是唯一特定位置的值成为新的。 那么考虑 dp 一下…...

从客户端拿到缓存数据-ConsumeClientReplicatedTargetData()

1...

减少KVCache

减少KVCache:从MHA,MQA,GQA到MLA 参考链接 科学空间,苏神的blog 大模型推理加速:看图学KVCache 前言 也是终于到了稍微有一点时间的时候,也需要对看过的东西进行简单的总结了。这里就总结一下论文中最喜欢的attention,以及与KVCache之间的关系。 基础:什么是attention?…...

考研复习-操作系统-第三章-内存管理 - 详解

考研复习-操作系统-第三章-内存管理 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

python_Day18_linux(1)

今日内容大纲介绍计算机简介 Linux系统介绍 Linux环境搭建 Linux基础命令1.计算机简介概述 全称叫电子计算机, 英文名叫Computer, 俗称叫: 电脑, 简称叫: PC, 就是有硬件和软件组成的电子设备.组成计算机硬件CPU, 中央处理器, 由 运算器 + 控制器 组成 存储器内存: 内存条, DDR…...

机器人动力学-上交桂凯-睿慕课

1.1 绪论 1.2 数学基础已知系统的初始状态+速度->未来的变化状态均可知质量弹簧阻尼二阶系统也可以写成微分方程的形式,状态变量为位置,速度2 动力学系统建模2.1 理论力学回顾...

2 linux系统基础命令+文件操作命令

2.1 常见命令 2.1.1 查看当前登录用户信息的基础命令 last # 显示上次登录的用户列表信息 who # 显示当前所有登录到系统的用户信息 whoami # 查看当前登录的用户 who am i # 仅显示当前终端登录系统的用户名+终端+登录时间+来源主机,‘i’可以是任意字符,等同于who -m […...

支持国产cpu架构的nacos-2.4.3

nacos无法启动主要问题是依赖于RocksDBjni没有对应架构的动态链接库 RocksDB JNI 的多平台 native 动态库集合系统 (OS) 架构 (Arch) libc 类型 对应文件名Linux x86 (32位) glibc librocksdbjni-linux32.somusl librocksdbjni-linux32-musl.sox86_64 (64位) glibc librocksdbj…...

nc工具使用 - 谷粒

https://www.cnblogs.com/zhipeng-wang/p/14070431.html 测试端口 nc -nvz 127.0.0.1 8000 监听 nc -l 80 连接client nc 127.0.0.1 8000想要连接到某处: nc [-options] hostname port[s] [ports] …绑定端口等待连接: nc -l port [-options] [hostname] [port]-g<网关>…...

完整教程:【C++】22. 封装哈希表实现unordered_set和unordered_map

完整教程:【C++】22. 封装哈希表实现unordered_set和unordered_mappre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New…...

Azure App Service连接Azure SQL MI

前言最近,在研究云迁移,做了个测试如何使用App Service连接SQL MI。正文1.测试项目是Net Framework v4.8,核心代码如下图:1 StringBuilder message = new StringBuilder();2 try3 {4 string sqlstr = "Server=smi-test.c5c92fb776c2.database.windows.net;Databas…...

将目标数据复制到服务器-ServerSetReplicatedTargetData()

ServerSetReplicatedTargetData 通常是一个自定义的服务器端 RPC(远程过程调用)函数,用于将目标数据(如瞄准目标、交互目标等)从客户端发送到服务器,并让服务器更新相应的复制变量,以便在多台客户端之间同步该数据。...

不是说 PHP 不行了吗?为什么 Swoole 还在更新?

PHP不行了,或许只是大家的一个简单的调侃,但这个调侃也代表了PHP语言从巅峰到下滑一个变迁。然而,现如今还是有很多的程序员依靠它在吃饭,语言只是一门工具,赚钱才是王道大家好,我是码农先森。 在微信的水群里,经常有兄弟说:"PHP不行了,PHP是上古时代的语言,PHP…...

qoj1831 Bruteforce

SOLUTION FROM WUMIN4 题意 若长度为 \(n\) 的数组 \(a\) 排序后为 \(b\),定义 \(a\) 的权值为 \(\sum_{i=1}^n \lfloor\frac{b_i\cdot i^k}{w}\rfloor \bmod 998244353\)。 有 \(q\) 次操作,每次操作修改一个 \(a_i\),随后输出 \(a\) 的权值。 \(n,a_i\le 10^5,1\le k,w\le…...

C++数据结构和算法:链表

Q. 有序表和无序表(Hash表)区别?Key有无序的区别。 Q. map 和 set 区别:有无伴随数据的区别。 有序表:红黑树、AVL树、size-banlance-tree、跳表都是有序表哈希表:基础类型,值传递;非基础类,必须提供比较器,引用传递。【经典题目】反转链表。要求实现单链表、双链表结…...

CAI:开源网络安全AI框架,打造自主安全测试智能体

CAI是一个开源的网络安全AI框架,能够自主执行从侦察到权限提升的完整网络安全攻击链。它集成了多种专业AI智能体,支持红蓝对抗、漏洞评估、数字取证等安全任务,并提供了丰富的基准测试工具和评估体系。项目概述 CAI(Cybersecurity AI)是一个开源的网络安全AI框架,旨在构建…...

GAS中,负责封装技能所影响的目标数据(如 Actor、位置、碰撞结果等)-FGameplayAbilityTargetData

example://FGameplayAbilityTargetData_SingleTargetHit 继承自FGameplayAbilityTargetData FGameplayAbilityTargetData_SingleTargetHit 是用于表示单一目标命中信息的目标数据结构,常用于游戏技能系统(Gameplay Ability System, GAS)中传递目标信息。 它主要包含以下核心…...