書名:代碼本色:用編程模擬自然系統(tǒng)
作者:Daniel Shiffman
譯者:周晗彬
ISBN:978-7-115-36947-5
第8章目錄
8.2 遞歸
1、康托爾集
-
1883年,德國數(shù)學(xué)家格奧爾格·康托爾開發(fā)了一套用于構(gòu)建無窮集合的簡單規(guī)則。
2、有限遞歸
- 這套規(guī)則有一個(gè)反饋回路。把一條線段分成兩條線段,把得到的線段再分成兩條,最終將得到4條線段。再將同樣的規(guī)則作用在這4條線段上,你會(huì)得到8條線段。
- 這種連續(xù)地在結(jié)果上重復(fù)應(yīng)用某個(gè)規(guī)則的過程就稱為遞歸。
- 康托爾十分關(guān)心無數(shù)次作用規(guī)則后產(chǎn)生的結(jié)果。
但我們只關(guān)心有限的像素空間,通常會(huì)忽略無限遞歸的問題。 - 因此我們應(yīng)該用代碼建立一套有限遞歸機(jī)制,而不是無限地在結(jié)果上運(yùn)用規(guī)則(這會(huì)讓程序崩潰)。
3、代碼實(shí)現(xiàn)
- 以下代碼是我們常做的事——在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)。
void someFunction() {
background(0); 在函數(shù)someFunction()中調(diào)用background()函數(shù)
}
- 如果我們?cè)诤瘮?shù)中調(diào)用自身,會(huì)發(fā)生什么?
調(diào)用自身的函數(shù)稱為遞歸函數(shù),它能有效地解決某些特定問題。 - 某些數(shù)學(xué)計(jì)算就是用遞歸實(shí)現(xiàn)的,最常見的例子就是階乘。
用更一般的方式表示,對(duì)任意正整數(shù)n,都有:
- n的階乘被定義為n乘以n-1的階乘。階乘的定義中也包含階乘
int factorial(int n) {
if (n == 1){
return 1;
} else {
return n * factorial(n-1);
}
}
4、示例
示例代碼8-2 兩次遞歸
用更復(fù)雜的方式實(shí)現(xiàn)drawCircle()函數(shù):對(duì)于任意圓圈,在它的左右兩邊分別畫一個(gè)半徑減半的圓圈。
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);
}
}
5、運(yùn)行結(jié)果

