換個角度看問題

更新於 發佈於 閱讀時間約 3 分鐘
Game of Life所設定的世界,是在無窮大的二維平面中。當然啦,寫程式時可沒有「無窮大」這回事,只能侷限在某一個有限的範圍內,必要時,再用平移的方式來處理。
既然是在有限的範圍內,那勢必會有邊界產生,而位於邊界和非邊界的cell,在處理上會有所不同。在檢查某個cell在下一代是不是活著時,必須去數周圍的cell中,有多少個是活著的。對於在universe內部的cell來說,這個不成問題,周圍一定是有8個其他的cell圍繞著。但是對於位於邊界的cell來說,可就不是這麼回事了。以universe[0][0]這個位於左上角邊界的cell來說,周圍的cell只有3個;但對於universe[1][0]這個cell來說,周圍的cell卻有5個。所以啊,在算某個cell周圍有多少活著的cell前,必須先判斷這個cell是不是位於邊界上,而且還要知道是在上、下、左、右、四個角落的哪一個邊界上。
要判斷某個cell是不是位於universe的邊界,其實也不是什麼困難的事,幾個if條件判斷式就解決了。可是啊,程式裡頭有一堆if,看起來還真是挺礙眼的,讓人不開心。除了這種個人的喜好和風格問題外,程式的效率問題也應該考慮一下。使用if來判斷cell是否位於邊界,直球對決,是很直接,不需多花腦筋,但卻很沒效率。那有沒有辦法把那礙眼的if給踢開不用呢?
不用if條件判斷式,就能知道cell是不是位於universe的邊界,看來是沒法做到的。不過,現在的目的是甩掉那一堆礙眼的if,這跟需不需要用if來判斷cell是不是位於邊界,還是有那麼一些不同。如果自始至終,都能保證所有的cell都不是在邊界上,那不是根本就不需要去特別處理邊界問題了嗎?這想法挺誘人的,問題是,怎麼做?
「保證所有的cell都不是在universe的邊界上」,換句話說,就是「保證所有的cell都在universe的內部」囉!這好辦!把universe弄大一些,然後把要處理的部分放中間,這樣就可以了。假設原先的universe高跟寬分別是height和width。現在在周圍,也就是上、下、左、右都加寬一行,變成高和寬分別加大成(height + 2)和(width + 2)。這樣子在高range(1, height+1)和寬range(1, width+1)內的所有cell,就是原來要處理的cell,而這些cell,就都位於這個比較大的universe的內部了。
簡單的一個動作,就把所有的cell從邊界挪到內部,但是啊但是,怎麼知道這樣子不會影響到後面的結果?以原來位在左上角邊界[0][0]這個位置的cell來看,原先周圍的cell有3個,現在被挪到[1][1],所以周圍的cell有8個。換句話說,在數周圍有多少活著的cell時,會多出新增加的5個cell。還好!我們在意的,是周圍有多少活著的cell,多出來的這5個,如果永遠都不是活著的,那就不會有什麼影響了。所以囉,只要設定在原來的universe周圍多加進來的cell不是活著的,而且永遠不會活過來,那就不用擔心會影響到結果了。至於怎樣才能讓這些額外引入的cell永遠不會活過來呢?其實很簡單,就不要理他們就好了!也就是說,只處理高range(1, height+1)和寬range(1, width+1)這個範圍內的cell就好了。
有時候簡單的轉換一下觀點,本來難以解決的問題就會變得簡單許多。把問題從「不使用if來判斷cell是不是位於邊界上」,轉換成「讓所有的cell都不是在邊界上」,就可解決原本看來是沒法解決的問題。寫程式時經常會有卡關的現象,這時候不要一味蠻幹,轉換一下看問題的角度,說不定就能過關。
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
15會員
131內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
在Python中,所有東西都是物件。執行程式碼a = 5,會建立5這個物件,然後給a一個reference,這個reference就是告訴a,它的值放在記憶體的哪個位置,要用時,就到那裡去拿。 看到這裡,很直覺的反應是:這不就是C裡頭的pointer嗎?!然後就沒再多想了。
comprehension應該可說是Python的絕學之一吧。不過既然是絕學,總是會有讓人容易在運氣時一個不小心走錯經脈的地方。現在我需要一個二維的list,利用comprehension來造一個,應該是再好不過的選擇。只是這地方,就是個容易出錯的地方。
蝦蜜?!Python沒有內建array?!剛發現這件事時,還真的有點傻眼,怎麼會沒有array這麼好用的data type呢?
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
在Python中,所有東西都是物件。執行程式碼a = 5,會建立5這個物件,然後給a一個reference,這個reference就是告訴a,它的值放在記憶體的哪個位置,要用時,就到那裡去拿。 看到這裡,很直覺的反應是:這不就是C裡頭的pointer嗎?!然後就沒再多想了。
comprehension應該可說是Python的絕學之一吧。不過既然是絕學,總是會有讓人容易在運氣時一個不小心走錯經脈的地方。現在我需要一個二維的list,利用comprehension來造一個,應該是再好不過的選擇。只是這地方,就是個容易出錯的地方。
蝦蜜?!Python沒有內建array?!剛發現這件事時,還真的有點傻眼,怎麼會沒有array這麼好用的data type呢?
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
遊戲是元宇宙的重要組成部分和試驗場。 在我的構想中,元宇宙可以成為一種綜合應用介面,使人們能夠在三維的環境中,更有效率地完成任務。 想像我們去超市時,自然地掃視貨架找到所需產品。若同樣情形換到網路購物平台,一個貨架的商品可能要分散在多個分頁中。
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
生命是由一長串的工作與選擇組成的,我們不僅需要一個必定能獲得成功的秘訣,我們還需要看穿這個世界的底牌。 而這種從事物的底層、本質出發,尋找解決問題路徑的思維方法,就稱為「底層邏輯」。 我們的一生充其量就是一場「機會的遊戲」。 或許事情不會一直如我們所願,或許計劃總是不如預期,然
你弟就是只想靠自己,我覺得由他吧,幫了可能還傷感情,由他自己發展。其實這樣也好,靠自己,你看beckham那些兒子,職業就是某人的兒子而己。 昨天鴨仔whatsapp我,我人在大陸,隔半天才回他,他就問我最近怎樣,我回了幾句他又沒回應,我想可能我說完自己平日工作很忙,沒有反問他 ‘那你呢?‘,所以
因為視覺中樞受損,左眼有時會看不到東西,所以去針灸了一年。因為主治醫師調走了,才沒有繼續下去。 有次有位實習醫生問我,不會懷疑兩千多年前的理論跟技術嗎? 我的回答是,一種技術可以持續兩千多年,一定有可取之處,問題是你們到底有沒有弄清楚正確的方法!鍋子也用了快三千年了,今天不是還在用鍋子嗎?材質可
Thumbnail
用不同的角度看見不一樣的臺灣,無論好壞與否那些我們習以為常的日常正是造就臺灣獨特的所在,這一切都將留在我們每個人記憶裡。
在公園的長椅上,我觀察著陽光穿透樹葉的斑駁光影,回想起與老友因觀點不同而爭執的經歷。通過沉思,發現分歧源於角度不同,並以陽光下的樹影為喻,闡述了看待事物的多元視角。文章提醒我們,在判斷事物前,不妨換個角度,或許會有意想不到的發現,並領悟到自己堅信的真理並非絕對。
Thumbnail
現實生活中,宇宙是如此的巨大,然而我們所能看見的生命卻如此的稀有, 這是一個令人困惑的矛盾。 但是,如果生命不僅僅是物質的形式, 那麼生命的數量就不能用現有的觀測方式來衡量。 小時候,我常常做夢,夢見自己變成不知道是什麼波,在黑暗中,沒有任何重力的束縛,往前飛,非常舒服。因此,我不斷思考,或許
Thumbnail
當將ACG中,各種巨人的作為與能力投射到自己身上時,再回到現實後,人類已經是超越始祖巨人的存在,我們不僅更理想、更崇高,還已實現作品中完全做不到的事、解決作品中產生的種種令人費解的難題。 我們是始祖巨人,正用著進擊的姿態,讓世界充滿文明。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
遊戲是元宇宙的重要組成部分和試驗場。 在我的構想中,元宇宙可以成為一種綜合應用介面,使人們能夠在三維的環境中,更有效率地完成任務。 想像我們去超市時,自然地掃視貨架找到所需產品。若同樣情形換到網路購物平台,一個貨架的商品可能要分散在多個分頁中。
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
生命是由一長串的工作與選擇組成的,我們不僅需要一個必定能獲得成功的秘訣,我們還需要看穿這個世界的底牌。 而這種從事物的底層、本質出發,尋找解決問題路徑的思維方法,就稱為「底層邏輯」。 我們的一生充其量就是一場「機會的遊戲」。 或許事情不會一直如我們所願,或許計劃總是不如預期,然
你弟就是只想靠自己,我覺得由他吧,幫了可能還傷感情,由他自己發展。其實這樣也好,靠自己,你看beckham那些兒子,職業就是某人的兒子而己。 昨天鴨仔whatsapp我,我人在大陸,隔半天才回他,他就問我最近怎樣,我回了幾句他又沒回應,我想可能我說完自己平日工作很忙,沒有反問他 ‘那你呢?‘,所以
因為視覺中樞受損,左眼有時會看不到東西,所以去針灸了一年。因為主治醫師調走了,才沒有繼續下去。 有次有位實習醫生問我,不會懷疑兩千多年前的理論跟技術嗎? 我的回答是,一種技術可以持續兩千多年,一定有可取之處,問題是你們到底有沒有弄清楚正確的方法!鍋子也用了快三千年了,今天不是還在用鍋子嗎?材質可
Thumbnail
用不同的角度看見不一樣的臺灣,無論好壞與否那些我們習以為常的日常正是造就臺灣獨特的所在,這一切都將留在我們每個人記憶裡。
在公園的長椅上,我觀察著陽光穿透樹葉的斑駁光影,回想起與老友因觀點不同而爭執的經歷。通過沉思,發現分歧源於角度不同,並以陽光下的樹影為喻,闡述了看待事物的多元視角。文章提醒我們,在判斷事物前,不妨換個角度,或許會有意想不到的發現,並領悟到自己堅信的真理並非絕對。
Thumbnail
現實生活中,宇宙是如此的巨大,然而我們所能看見的生命卻如此的稀有, 這是一個令人困惑的矛盾。 但是,如果生命不僅僅是物質的形式, 那麼生命的數量就不能用現有的觀測方式來衡量。 小時候,我常常做夢,夢見自己變成不知道是什麼波,在黑暗中,沒有任何重力的束縛,往前飛,非常舒服。因此,我不斷思考,或許
Thumbnail
當將ACG中,各種巨人的作為與能力投射到自己身上時,再回到現實後,人類已經是超越始祖巨人的存在,我們不僅更理想、更崇高,還已實現作品中完全做不到的事、解決作品中產生的種種令人費解的難題。 我們是始祖巨人,正用著進擊的姿態,讓世界充滿文明。