用遞歸函數(shù)實現(xiàn)康托爾集

書名:代碼本色:用編程模擬自然系統(tǒng)
作者:Daniel Shiffman
譯者:周晗彬
ISBN:978-7-115-36947-5
第8章目錄

8.3 用遞歸函數(shù)實現(xiàn)康托爾集

接下來罕容,我們要用遞歸函數(shù)實現(xiàn)康托爾集的可視化。從哪里開始长搀?

1袋哼、繪制線段的函數(shù)

  • 我們知道康托爾集在開始時是一個線段描孟。因此,我們可以先實現(xiàn)一個用于繪制線段的函數(shù)弓柱。
void cantor(float x, float y, float len) {
      line(x,y,x+len,y);
}
  • 上面的cantor()函數(shù)在坐標(biāo)(x,y)處開始畫一個線段鼠哥,線段長度是len。
  • (假設(shè)線段是水平的)因此露久,如果我們按以下方式調(diào)用cantor()函數(shù):
    cantor(10, 20, width-20);
    就會得到這條線段

2更米、繼續(xù)繪制下面兩條線段

  • 從康托爾規(guī)則中可以看出,我們需要去掉線段中間的1/3毫痕,剩下兩條線段:一條線段從起點到1/3處征峦,另一個條線段從2/3處到終點迟几。


  • 我們要分別繪制這兩條線段。我們沿y軸方向?qū)⑦@兩條線段下移幾個像素栏笆,讓它們顯示在原線段的下方类腮。

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處到終點
}
  • 盡管這是一個很好的開始,但重復(fù)地為每個線段調(diào)用line()函數(shù)并不是我們想要的實現(xiàn)方式蛉加。
    線段的數(shù)量會很快地增長蚜枢,接下來我們要調(diào)用4次line()函數(shù),再接著是8次针饥,然后是16次……for循環(huán)曾經(jīng)是我們解決此類問題的常用方法厂抽,但嘗試之后你會發(fā)現(xiàn),用循環(huán)的方法解決這個問題是非常復(fù)雜的打厘。
  • 在這時候修肠,遞歸就派上用場了,能拯救我們于水火之中户盯。

3嵌施、遞歸實現(xiàn)

  • 回顧一下我們?nèi)绾卫L制第一個條線段,也就是從起點到1/3處的線段:
    line(x,y,x+len/3,y);
    我們可以把這里的line()替換成cantor()函數(shù)莽鸭。因為cantor()函數(shù)本來就會在(x,y)位置畫一條指定長度的線段吗伤!因此:
    line(x,y,x+len/3,y); 替換成 -------> cantor(x,y,len/3);
  • 對于下面的line()函數(shù)調(diào)用,也有:
    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()函數(shù)是遞歸調(diào)用的,在調(diào)用過程中礁阁,同樣的規(guī)則會作用于下一條線段巧号,再作用于下下條線段……別急著運(yùn)行代碼,我們還少了一個關(guān)鍵元素:退出條件姥闭。我們必須保證遞歸在某個點上能停下來——比如線段的長度小于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);
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棚品,一起剝皮案震驚了整個濱河市靠欢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铜跑,老刑警劉巖门怪,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锅纺,居然都是意外死亡掷空,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拣帽,“玉大人疼电,你說我怎么就攤上這事〖跏茫” “怎么了蔽豺?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拧粪。 經(jīng)常有香客問我修陡,道長,這世上最難降的妖魔是什么可霎? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任魄鸦,我火速辦了婚禮,結(jié)果婚禮上癣朗,老公的妹妹穿的比我還像新娘拾因。我一直安慰自己,他們只是感情好旷余,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布绢记。 她就那樣靜靜地躺著,像睡著了一般正卧。 火紅的嫁衣襯著肌膚如雪蠢熄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天炉旷,我揣著相機(jī)與錄音签孔,去河邊找鬼。 笑死窘行,一個胖子當(dāng)著我的面吹牛饥追,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罐盔,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼但绕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翘骂?” 一聲冷哼從身側(cè)響起壁熄,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帚豪,失蹤者是張志新(化名)和其女友劉穎碳竟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狸臣,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡莹桅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诈泼。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡懂拾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铐达,到底是詐尸還是另有隱情岖赋,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布瓮孙,位于F島的核電站唐断,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杭抠。R本人自食惡果不足惜脸甘,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望偏灿。 院中可真熱鬧丹诀,春花似錦、人聲如沸翁垂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沮峡。三九已至疚脐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邢疙,已是汗流浹背棍弄。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留疟游,地道東北人呼畸。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像颁虐,于是被迫代替她去往敵國和親蛮原。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容