news 2026/3/26 22:49:07

用递归函数实现康托尔集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用递归函数实现康托尔集

8.3 用递归函数实现康托尔集

接下来,我们要用递归函数实现康托尔集的可视化。从哪里开始?

1、绘制线段的函数

  • 我们知道康托尔集在开始时是一个线段。因此,我们可以先实现一个用于绘制线段的函数。
void cantor(float x, float y, float len) { line(x,y,x+len,y); }
  • 上面的cantor()函数在坐标(x,y)处开始画一个线段,线段长度是len。
  • (假设线段是水平的)因此,如果我们按以下方式调用cantor()函数:
    cantor(10, 20, width-20);
    就会得到这条线段

2、继续绘制下面两条线段

  • 从康托尔规则中可以看出,我们需要去掉线段中间的1/3,剩下两条线段:一条线段从起点到1/3处,另一个条线段从2/3处到终点。

  • 我们要分别绘制这两条线段。我们沿y轴方向将这两条线段下移几个像素,让它们显示在原线段的下方。

void cantor(float x, float y, float len) { line(x,y,x+len,y); y += 20; line(x,y,x+len/3,y); 从起点到1/3处 line(x+len*2/3,y,x+len,y); 从2/3处到终点 }

  • 尽管这是一个很好的开始,但重复地为每个线段调用line()函数并不是我们想要的实现方式。
    线段的数量会很快地增长,接下来我们要调用4次line()函数,再接着是8次,然后是16次……for循环曾经是我们解决此类问题的常用方法,但尝试之后你会发现,用循环的方法解决这个问题是非常复杂的。
  • 在这时候,递归就派上用场了,能拯救我们于水火之中。

3、递归实现

  • 回顾一下我们如何绘制第一个条线段,也就是从起点到1/3处的线段:
    line(x,y,x+len/3,y);
    我们可以把这里的line()替换成cantor()函数。因为cantor()函数本来就会在(x,y)位置画一条指定长度的线段!因此:
    line(x,y,x+len/3,y); 替换成 -------> cantor(x,y,len/3);
  • 对于下面的line()函数调用,也有:
    line(x+len2/3,y,x+len,y); 替换成 -------> cantor(x+len2/3,y,len/3);
  • 于是,我们就有了以下代码:
void cantor(float x, float y, float len) { line(x,y,x+len,y); y += 20; cantor(x,y,len/3); cantor(x+len*2/3,y,len/3); }

4、退出条件

  • 由于cantor()函数是递归调用的,在调用过程中,同样的规则会作用于下一条线段,再作用于下下条线段……别急着运行代码,我们还少了一个关键元素:退出条件。我们必须保证递归在某个点上能停下来——比如线段的长度小于1个像素。

5、示例

示例代码8-4 康托尔集

void setup() { size(800, 200); background(255); // Call the recursive function cantor(35, 0, 730); } void draw() { // No need to loop noLoop(); } void cantor(float x, float y, float len) { float h = 30; // recursive exit condition if (len >= 1) { // Draw line (as rectangle to make it easier to see) noStroke(); fill(0); rect(x, y, len, h/3); // Go down to next y position y += h; // Draw 2 more lines 1/3rd the length (without the middle section) cantor(x, y, len/3); cantor(x+len*2/3, y, len/3); } }

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 7:07:08

SAP ABAP程序提交后台JOB执行实例

一、代码当一个报表程序ALV数据过多,点击功能按钮执行过慢时可以选择提交后台JOB执行。如下为提交后台执行的formFORM frm_submit_job .DATA: lv_jobname LIKE tbtcjob-jobname,lv_jobcount LIKE tbtcjob-jobcount,lt_stable TYPE TABLE OF rsparams.DATA: lv_…

作者头像 李华
网站建设 2026/3/16 7:07:06

32、Windows Server 数据复制与加密技术全解析

Windows Server 数据复制与加密技术全解析 1. DFS 概述与应用 DFS(分布式文件系统)用于将相同内容分发到组织内的多个站点。但要注意,DFS 并非备份方案,因为一个文档中的错误会复制到所有其他位置。在配置 DFS 托管文件时,需思考文件是否真的需要复制到多个位置,若是,…

作者头像 李华
网站建设 2026/3/16 5:50:20

微振动如何做?

在电子洁净厂房的装修设计中,微振控制是确保精密设备稳定运行、保障产品质量的关键环节。为有效解决微振问题,需从场地选址、结构设计、设备选型与安装、施工管理、以及监测与维护等方面进行系统性规划。以下是具体措施,具体就随北京恒帆减振…

作者头像 李华
网站建设 2026/3/16 7:07:02

如何训练专属Embedding模型提升检索质量?

如何训练专属Embedding模型提升检索质量? 在构建智能问答系统时,你是否遇到过这样的情况:用户问“CRM工单怎么升级?”,系统却返回了“客户满意度调查流程”;或者提问“EHR系统登录失败怎么办”,…

作者头像 李华
网站建设 2026/3/16 7:07:00

新手必看:Vivado固化程序烧写硬件环境搭建

从零开始搞定FPGA程序固化:Vivado烧写实战全解析 你有没有遇到过这样的情况? 在Vivado里辛辛苦苦写完代码、综合实现、生成比特流,用JTAG下载到FPGA上功能一切正常。可一拔线、一断电——再上电,板子“瘫了”?LED不闪…

作者头像 李华
网站建设 2026/3/26 3:10:41

客户成功经理的得力助手:快速响应客户疑问

客户成功经理的得力助手:快速响应客户疑问 在客户成功团队的日常工作中,一个看似简单的问题却常常耗费大量时间:“我们上次是怎么给客户配置单点登录的?”“这个功能的 SLA 到底包含哪些场景?”面对不断迭代的产品文档…

作者头像 李华