2015-10-15 94 views
2

我不知道我怎麼會在C.你將如何產生Sierpinski三角形的C(遞歸)

遞歸產生一定深度的Sierpinski三角形我寫了這個功能來生成高度h形成一個三角形*的頂點座標(x,y)*。

void triangle(char display[100][100],int x, int y, int h) { 

    for (int row = y; row<=h-1+y; row++) { 
     for (int column = x; column<=2*(row+1-y)+x-2; column++) { 
      display[row][column-(row+1-y)+1] = '*'; 
     } 
    } 

    for (int i = 0 ; i<100 ; i++) { 
     for (int j = 0; j<100; j++) { 
      if (display[i][j]=='\0') 
       display[i][j]=' '; 
     } 
    } 



} 

使用此代碼我可以生成「手動」Sierpinski三角形。但我想遞歸地做,任何深度和高度(高度可以被2 ^(深度)整除)。

int main() 
{ 
    char display[100][100] = { {0} }; 

    triangle(display, 20, 0, 5); 

    triangle(display, 15, 5, 5); 
    triangle(display, 25, 5, 5); 

    triangle(display, 10, 10, 5); 
    triangle(display, 30, 10, 5); 

    triangle(display, 5, 15, 5); 
    triangle(display, 15, 15, 5); 
    triangle(display, 25, 15, 5); 
    triangle(display, 35, 15, 5); 


    for (int i=0 ; i<100; i++) { 
     printf("\n"); 
     for (int j=0; j<100; j++) { 
      printf("%c", display[i][j]); 
     } 
    } 
} 

這是我上面的代碼輸出:

This is my output for the code above

+1

遞歸意味着函數自己調用。所以,而不是主要三角函數的所有調用,爲什麼沒有三角函數增加它的參數,然後...等待它...調用三角形()! – par

+0

事情是,我不知道如何找到每個三角形的頂點爲任何給定的深度 –

+0

你應該說在你的問題。正如所寫的那樣,「請爲我做我的功課。」立即想到的一個想法是爲稱爲「深度」的三角函數添加額外的參數。首先調用三角形()(深度爲0),並從三角形內部用'++ depth'作爲'depth'參數遞歸調用它。每當「深度%h」爲零時,您就知道您處於三角形的頂部。 – par

回答

1

這不是一個謝爾賓斯基三角形,只是看起來很像一個。你正在繪製單獨的小三角形(作爲它在三角形之間有間隙的副作用 - >"...*** ***..."

想象如何創建這樣一個三角形的最好方法是抓住一支鉛筆和一張紙(有優化版本的創建三角形,但機械方法是很好的一個開始):

  1. 選擇深度(比如說:3)
  2. 畫出一個三角形(最好是正三角形但任何能做到)
  3. (如果深度 = 0,那麼從這裏返回;否則繼續)
  4. 下降深度
  5. 減半各方並標記這些點(對視覺輔助)
  6. 連接這些點,所以你會看到4相等,更小的三角形
  7. 選擇更小的三角#1
  8. 電話線3
  9. 選擇更小的三角#2
  10. 電話線3
  11. 選擇更小的三角#3
  12. 電話線3
  13. 選擇更小的三角#4
  14. 電話線3

某處在這個過程中你需要管理其開始於depth的狀態一個正整數。你必須在遞歸調用之間減少它,並檢查它是否爲0,當你達到0時,你必須返回。它可以是一個全局變量(容易理解但很難看),或者它可以是繪圖函數的參數(很好)。

這個「選擇較小的三角形#x和呼叫線3」。是自我遞歸調用。 選擇三角形只是計算較大三角形中較小三角形的正確座標。

如果深度大於1,遞歸性質將踢入。代碼將檢查深度(如果返回0,則返回),細分原始三角形,在第一個較小的三角形上調用它自己,有效地處理這個較小的三角形,就好像它是原始的大三角形一樣(函數本身沒有「較大「和」更小「)。