用递归函数实现康托尔集

简介: 用递归函数实现康托尔集

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);
}
}

作者:大龙10
链接:https://www.jianshu.com/p/2b262a48c376
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
6月前
什么是递归函数?怎样实现递归?
什么是递归函数?怎样实现递归?
|
2月前
利用递归方法求5!
利用递归方法求5!.
17 9
|
3月前
|
缓存 算法 Java
递归函数
递归函数
58 1
|
3月前
|
搜索推荐 开发者 Python
递归调用
递归调用
|
5月前
函数\递归函数求阶乘
函数\递归函数求阶乘
47 3
|
6月前
|
算法
递归函数实现素数判断
该文介绍了素数判断的递归实现,尽管递归算法在判断素数上并不高效,时间复杂度和空间复杂度均为O(N),但作为学习和理解递归的一种方式,仍有其价值。文章强调在实际应用中应选择更高效的方法。递归思路基于试除法,对于大于1的整数,如果只能被1和自身整除,则为素数。递归函数通过不断试除2到根号下该数之间的数来判断,同时注意到偶数不是素数。文中给出了非递归和递归的试除法代码示例。
105 2
|
6月前
递归阶乘详解
递归阶乘详解
42 1
|
6月前
|
C语言
递归求阶乘
【1月更文挑战第18天】C语言实例——递归求阶乘。
34 1
|
机器学习/深度学习
递归函数问题
递归函数问题
62 0