換個角度看問題

更新於 發佈於 閱讀時間約 4 分鐘

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
留言分享你的想法!
avatar-img
ysf的沙龍
15會員
141內容數
寫點東西自娛娛人
ysf的沙龍的其他內容
2025/04/14
花了些時間,靜下心來,仔仔細細地研究了一番,總算把Python呼叫函數時引數的傳遞方式給徹底搞清楚了。
2025/04/14
花了些時間,靜下心來,仔仔細細地研究了一番,總算把Python呼叫函數時引數的傳遞方式給徹底搞清楚了。
2024/05/08
呼!折騰了好久,終於徹底搞清楚pygame的各個blend mode所用的計算式,到底是長啥樣子了。
2024/05/08
呼!折騰了好久,終於徹底搞清楚pygame的各個blend mode所用的計算式,到底是長啥樣子了。
2023/12/20
在寫《The Nature of Code閱讀心得筆記——使用Python實作》的[第四章]4.3節時,原書提到,在使用Java的ArrayList時,如果用迴圈一面走訪一面又移除其中的元素,那會有難以察覺的問題存在。寫個小程式測試的結果發現,Python的list也會有一樣的問題。
Thumbnail
2023/12/20
在寫《The Nature of Code閱讀心得筆記——使用Python實作》的[第四章]4.3節時,原書提到,在使用Java的ArrayList時,如果用迴圈一面走訪一面又移除其中的元素,那會有難以察覺的問題存在。寫個小程式測試的結果發現,Python的list也會有一樣的問題。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
遊戲是元宇宙的重要組成部分和試驗場。 在我的構想中,元宇宙可以成為一種綜合應用介面,使人們能夠在三維的環境中,更有效率地完成任務。 想像我們去超市時,自然地掃視貨架找到所需產品。若同樣情形換到網路購物平台,一個貨架的商品可能要分散在多個分頁中。
Thumbnail
遊戲是元宇宙的重要組成部分和試驗場。 在我的構想中,元宇宙可以成為一種綜合應用介面,使人們能夠在三維的環境中,更有效率地完成任務。 想像我們去超市時,自然地掃視貨架找到所需產品。若同樣情形換到網路購物平台,一個貨架的商品可能要分散在多個分頁中。
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
生命是由一長串的工作與選擇組成的,我們不僅需要一個必定能獲得成功的秘訣,我們還需要看穿這個世界的底牌。 而這種從事物的底層、本質出發,尋找解決問題路徑的思維方法,就稱為「底層邏輯」。 我們的一生充其量就是一場「機會的遊戲」。 或許事情不會一直如我們所願,或許計劃總是不如預期,然
Thumbnail
生命是由一長串的工作與選擇組成的,我們不僅需要一個必定能獲得成功的秘訣,我們還需要看穿這個世界的底牌。 而這種從事物的底層、本質出發,尋找解決問題路徑的思維方法,就稱為「底層邏輯」。 我們的一生充其量就是一場「機會的遊戲」。 或許事情不會一直如我們所願,或許計劃總是不如預期,然
Thumbnail
用不同的角度看見不一樣的臺灣,無論好壞與否那些我們習以為常的日常正是造就臺灣獨特的所在,這一切都將留在我們每個人記憶裡。
Thumbnail
用不同的角度看見不一樣的臺灣,無論好壞與否那些我們習以為常的日常正是造就臺灣獨特的所在,這一切都將留在我們每個人記憶裡。
Thumbnail
現實生活中,宇宙是如此的巨大,然而我們所能看見的生命卻如此的稀有, 這是一個令人困惑的矛盾。 但是,如果生命不僅僅是物質的形式, 那麼生命的數量就不能用現有的觀測方式來衡量。 小時候,我常常做夢,夢見自己變成不知道是什麼波,在黑暗中,沒有任何重力的束縛,往前飛,非常舒服。因此,我不斷思考,或許
Thumbnail
現實生活中,宇宙是如此的巨大,然而我們所能看見的生命卻如此的稀有, 這是一個令人困惑的矛盾。 但是,如果生命不僅僅是物質的形式, 那麼生命的數量就不能用現有的觀測方式來衡量。 小時候,我常常做夢,夢見自己變成不知道是什麼波,在黑暗中,沒有任何重力的束縛,往前飛,非常舒服。因此,我不斷思考,或許
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News