遞歸

書名:代碼本色:用編程模擬自然系統(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 \times (n-1)! \\ 1!=1
  • 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é)果

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容