书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
第8章目录
8.2 递归
1、康托尔集
-
1883年,德国数学家格奥尔格·康托尔开发了一套用于构建无穷集合的简单规则。
2、有限递归
- 这套规则有一个反馈回路。把一条线段分成两条线段,把得到的线段再分成两条,最终将得到4条线段。再将同样的规则作用在这4条线段上,你会得到8条线段。
- 这种连续地在结果上重复应用某个规则的过程就称为递归。
- 康托尔十分关心无数次作用规则后产生的结果。
但我们只关心有限的像素空间,通常会忽略无限递归的问题。 - 因此我们应该用代码建立一套有限递归机制,而不是无限地在结果上运用规则(这会让程序崩溃)。
3、代码实现
- 以下代码是我们常做的事——在一个函数中调用另一个函数。
void someFunction() {
background(0); 在函数someFunction()中调用background()函数
}
- 如果我们在函数中调用自身,会发生什么?
调用自身的函数称为递归函数,它能有效地解决某些特定问题。 - 某些数学计算就是用递归实现的,最常见的例子就是阶乘。
用更一般的方式表示,对任意正整数n,都有:
- n的阶乘被定义为n乘以n-1的阶乘。阶乘的定义中也包含阶乘
int factorial(int n) {
if (n == 1){
return 1;
} else {
return n * factorial(n-1);
}
}
4、示例
示例代码8-2 两次递归
用更复杂的方式实现drawCircle()函数:对于任意圆圈,在它的左右两边分别画一个半径减半的圆圈。
void setup() {
size(640,360);
}
void draw() {
background(255);
drawCircle(width/2,height/2,400);
noLoop();
}
// Recursive function
void drawCircle(float x, float y, float r) {
stroke(0);
noFill();
ellipse(x, y, r, r);
if(r > 2) {
// Now we draw two more circles, one to the left
// and one to the right
drawCircle(x + r/2, y, r/2);
drawCircle(x - r/2, y, r/2);
}
}