謝賓斯基三角形是一個有意思的圖形,(英語:Sierpinski triangle)是一種分形,由波蘭數(shù)學家謝爾賓斯基在1915年提出,它是一種典型的自相似集。
先畫一個三角形,然后呢,取三角形的中點,組成一個新的三角形,把新的三角形挖空。
依次遞歸,就出現(xiàn)了后面的那個圖形。
如果用C語言來畫一個這樣的三角形,我們需要怎么畫呢?
我們先看看這樣一段代碼,思路還是跟之前一樣,在屏幕上畫出一個矩形,x行和y列。
#include#include #include #define SIZE (1 << 5)/*64*/ /* 毫秒級 延時 */ void msleep(int ms) { struct timeval delay; delay.tv_sec = 0; delay.tv_usec = ms * 1000; // 20 ms select(0, NULL, NULL, NULL, &delay); } int main() { int x, y, i; printf("%d\n",SIZE); /*y用來控制列數(shù)*/ for (y = SIZE - 1; y >= 0; y--, msleep(20),putchar('\n')) { /*控制行輸出*/ for (i = 0; i < y; i++) {msleep(20);putchar('^');} } return 0; }
代碼輸出
為了方便大家觀看,我做了一些調(diào)整
為了測試,我把代碼改成這樣,方便大家看到輸出。
#include#define SIZE (1 << 3) int main() { int x, y, i; printf("%d\n",SIZE); /*y用來控制列數(shù)*/ for (y = SIZE - 1; y >= 0; y--,putchar('\n')) { /*控制行輸出*/ for (i = 0; i < y; i++) {putchar('^');} for (x = 0; x + y < SIZE; x++){ putchar('#'); } } return 0; }
代碼輸出
weiqifa@bsp-ubuntu1804:~/c$ gcc shengdanshu.c && ./a.out 8 ^^^^^^^# ^^^^^^## ^^^^^### ^^^^#### ^^^##### ^^###### ^####### ######## weiqifa@bsp-ubuntu1804:~/c$
這里可以好好分析一下
y 長度是用來控制輸出多少行,可以看到一共有 8 行。
i 的長度是用來輸出 ^ 字符的,這個字符隨著 y的減少也會相應減小。
x 也受到y(tǒng) 的限制,主要是在另一半輸出 # 號字符。
知道了上面,我們來看看核心代碼
#include#define SIZE (1 << 3) int main() { int x, y, i; printf("%d\n",SIZE); /*y用來控制列數(shù)*/ for (y = SIZE - 1; y >= 0; y--,putchar('\n')) { /*控制行輸出*/ for (i = 0; i < y; i++) {putchar('^');} for (x = 0; x + y < SIZE; x++){ printf((x & y) ? " " : "*"); } } return 0; }
代碼輸出
8 ^^^^^^^* ^^^^^^** ^^^^^* * ^^^^**** ^^^* * ^^** ** ^* * * * ********
已經(jīng)有了我們題目上所的三角形的模樣了,這里只要再稍微修改下,就可以得到我們題目中所的那樣的三角形了。不對稱的原因主要是因為字符高度是寬度的兩倍。
代碼修改成這樣
#include#define SIZE (1 << 3) int main() { int x, y, i; printf("%d\n",SIZE); /*y用來控制列數(shù)*/ for (y = SIZE - 1; y >= 0; y--,putchar('\n')) { /*控制行輸出*/ for (i = 0; i < y; i++) {putchar('^');} for (x = 0; x + y < SIZE; x++){ printf((x & y) ? " " : "* "); } } return 0; }
代碼輸出
weiqifa@bsp-ubuntu1804:~/c$ gcc shengdanshu.c && ./a.out 8 ^^^^^^^* ^^^^^^* * ^^^^^* * ^^^^* * * * ^^^* * ^^* * * * ^* * * * * * * * * * * * weiqifa@bsp-ubuntu1804:~/c$
然后我們把 ^ 字符替換成空格,也就是我們想要的東西了。
然后空格和 * 的字符輸出,主要是靠 x & y 來控制的,他們又是如何控制的呢?
我們計算一下上面的算法
綠色的地方是我們輸出 * 字符的位置,藍色的 是我們輸出 空格的位置,空格是兩個空格,所以就出現(xiàn)了我們看到的那樣。
我們再修改下代碼
#include#define SIZE (1 << 5) int main() { int x, y, i; printf("%d\n",SIZE); /*y用來控制列數(shù)*/ for (y = SIZE - 1; y >= 0; y--,putchar('\n')) { /*控制行輸出*/ for (i = 0; i < y; i++) {putchar(' ');} for (x = 0; x + y < SIZE; x++){ printf((x & y) ? " " : "* "); } } return 0; }
代碼輸出
weiqifa@bsp-ubuntu1804:~/c$ gcc shengdanshu.c && ./a.out 32 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * weiqifa@bsp-ubuntu1804:~/c$
這樣看起來是不是很酷了。
我在我的另一個號里面用這樣方法畫了一個圣誕樹,我覺得也挺有意思的,喜歡的同學可以看看,當時寫那個代碼的時候是圣誕夜,我們剛好在開會,覺得有點無聊。
鏈接如下
如何用 C 語言畫一個「圣誕樹」?
知乎上的大神畫圣誕樹,基礎理論也是基于這個,后續(xù)剖析一下,我覺得非常有意思。
附上幾張謝賓斯基三角形的圖片
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!