# 如何寫程式:思維才是重點 :::info 與其說學寫程式是學語法,不如說是一場思維的鍛鍊 ::: 在學習寫程式時,我們常常將注意力集中在語法、函式或框架的使用上,卻容易忽略更核心的部分:**程式思維**。所謂程式思維,是指在**面對問題時,如何進行分析、拆解、推理、驗證到優化的一整套過程**。本文將以「**理解問題 → 分解問題 → 設計流程 → 邏輯驗證 → 實作與測試 → 重構優化**」這六個階段,來說明寫程式背後的思考脈絡。我們將以一個簡單的題目——「**判斷某年是否為閏年**[^1]」為例,貫穿這六個階段,並在最後輔以另一個簡單案例「**0與1切換**[^2]」作補充 ## 1. 理解問題:找出真正的需求 在開始寫程式之前,第一步永遠是**確認我們要解決的問題是什麼**。以「閏年判斷」為例,表面上只是判斷一個年份是否為閏年,但實際上很多人會忽略它背後真正的規則: - 一個年份若能被4整除,且不能被100整除,就是閏年 - 但如果能被400整除,則仍為閏年 這裡隱含兩層邏輯結構,「**例外中的例外**」,若沒搞清楚,就可能寫出錯誤的邏輯 :::info 不要急著寫程式,先搞懂題目的真義與細節 ::: ## 2. 分解問題:把複雜的邏輯拆成小步驟 接著,我們將整體條件拆成更小的條件判斷: - `year % 4 == 0` - `year % 100 != 0` - `year % 400 == 0` 這三個條件可以讓我們清楚知道每一個邏輯分支的成立與否。初學者常會一開始就想寫一個大判斷式,導致程式又長又難讀。事實上,**清楚地分解條件邏輯**,能幫助我們在後續測試與錯誤修正時省下大量時間 ## 3. 設計流程:邏輯該怎麼走? 現在我們有了條件,那要如何依序處理?可以畫個簡單的流程圖或寫出文字流程: ``` 如果能被4整除: → 如果不能被100整除:是閏年 → 如果能被400整除:是閏年 → 其他:不是閏年 否則就不是閏年 ``` :::info 在這階段我們專注於「邏輯順序」而不是語法正確性。先釐清流程,再動手寫程式碼 ::: ## 4. 邏輯驗證:邊界情況與例外很重要 設計完流程後,不代表我們的邏輯就一定正確。這時應該用一些**特殊或容易出錯的例子來驗證**: - 2000 → 是閏年(能被400整除) - 1900 → 不是閏年(能被100整除但不能被400整除) - 2024 → 是閏年(能被4整除但不能被100整除) - 2023 → 不是閏年(不能被4整除) 這個過程稱為**邏輯驗證**,在還沒動手寫程式前,就可以先用紙筆或心算推演 ## 5. 實作與測試:寫程式只是中間步驟 到了這裡,才是真正「寫程式」的部分,但因為邏輯早已設計好,這步通常不會太困難: ```python def is_leap_year(year): return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0) ``` 然後測試: ```python print(is_leap_year(2024)) # True print(is_leap_year(1900)) # False print(is_leap_year(2000)) # True ``` 透過簡單測試,確認我們的程式符合前面推理的結果 ## 6. 重構優化:從「能跑」到「寫得好」 最後一步,是**思考我們能不能把程式寫得更簡潔**、更清楚,或者寫出「更像程式設計師」的風格 我們補充另一個經典例子:「輸入是 0 輸出 1,輸入是 1 輸出 0」,很多人會寫: ```python if n == 0: return 1 else: return 0 ``` 但有經驗的程式設計師可能會直接寫: ```python return (n + 1) % 2 ``` 這就是所謂的**重構**(**refactoring**):不改變功能的前提下,讓程式更簡潔、有效率、好維護 ## 結語:寫程式不是語法競賽,而是思維訓練 程式語法會過時或改變,但思維方式會留下來。學會用程式設計的方式思考問題,不僅能幫你寫出更好的程式,也能在解決日常問題時更有條理、更有邏輯。希望透過這篇文章,你能開始練習用這六個階段去思考每一道題目——就算是一個簡單的「閏年判斷」或「0與1切換」,都值得我們深思與優化 ## [回到主頁](https://hackmd.io/@Huanyu763/home) [^1]:Zero Judge例題:https://zerojudge.tw/ShowProblem?problemid=d067 [^2]:Zero Judge例題:https://zerojudge.tw/ShowProblem?problemid=d063
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up