第 三 講
用 數 學 寫 程 式
python 程式設計
python 簡要講義
國立中央大學數學系 吳維漢
學好程式的關鍵 : 善用數學推導
2
 先想清楚再動手撰寫
 利用數學思維於紙筆上推導
 將複雜問題簡化成系列的漸進式題組,然後逐步克服
 與人討論可破除思考盲點,但程式仍需自己完成
 寫程式通常會出錯,很少有一路順利完成程式
 留意解譯器產生的錯誤訊息
 看懂他人程式後,冷卻後重頭撰寫
 試著變化已完成的程式問題,再次練習
 多多找尋題目挑戰自己
 精神不濟時避免練習程式,徒然浪費時間
 學好程設就要經常練習,別無他法
 https://stackoverflow.com/
3 用數學寫程式
三角數字塔 (一)
33 用數學寫程式
三角數字塔 (二)
43 用數學寫程式
while True :
n = int( input("> ") )
# 大縱向
for s in range(n) :
# 小縱向
for i in range(n) :
print( " "*((n-1-s)*n) , end="" )
# 大橫向
for t in range(s+1) :
print( " "*(n-1-i)+str(i+1)*(2*i+1)+
" "*(n-1-i) , end="" )
print()
print()
當程式問題有些複雜,找不出清楚的規律,此時可將問題簡化到可完成的小問題,
然後由此小問題逐步加入條件,循序漸進完成程式設計。
三角數字塔 (三)
53 用數學寫程式
 分解步驟:
1.列印一個數字三角形,但將三角形當成矩形列印,也就是包含
數字前後的空格,先以橫線替代,以下 n = 4 為例:
2.列印一排數字矩形:
---1---
--222--
-33333-
4444444
---1--- ---1--- ---1--- ---1---
--222-- --222-- --222-- --222--
-33333- -33333- -33333- -33333-
4444444 4444444 4444444 4444444
三角數字塔 (四)
63 用數學寫程式
3.列印 n 排數量遞增的數字矩形:
---1---
--222--
-33333-
4444444
---1--- ---1---
--222-- --222--
-33333- -33333-
4444444 4444444
---1--- ---1--- ---1---
--222-- --222-- --222--
-33333- -33333- -33333-
4444444 4444444 4444444
---1--- ---1--- ---1--- ---1---
--222-- --222-- --222-- --222--
-33333- -33333- -33333- -33333-
4444444 4444444 4444444 4444444
4.在每排數字矩形之前增加若干個空格,
以星號替代。
************---1---
************--222--
************-33333-
************4444444
********---1--- ---1---
********--222-- --222--
********-33333- -33333-
********4444444 4444444
****---1--- ---1--- ---1---
****--222-- --222-- --222--
****-33333- -33333- -33333-
****4444444 4444444 4444444
---1--- ---1--- ---1--- ---1---
--222-- --222-- --222-- --222--
-33333- -33333- -33333- -33333-
4444444 4444444 4444444 4444444
山水圖案 (一)
73 用數學寫程式
山水圖案 (二)
83 用數學寫程式
while True :
n = int( input("> ") )
# 山
for i in range(n) :
for j in range(-n+1,n) :
s = abs(j) # 山高至頂端距離
h = n - s # 山高
w = 2 * ( n - abs(j) ) # 山寬
t = i - s # 山頂往下距離
if i < s :
print( " "*w , end="" )
else :
print( " "*(n-1-i)+"/"+"*"*(2*t)+""+
" "*(n-1-i) , end="" )
print()
山水圖案 (三)
93 用數學寫程式
# 水
for i in range(2) :
for j in range(-n+1,n) :
w = 2*(n-abs(j))
print( "~"*w , end="" )
print()
print()
山水圖案 (四)
103 用數學寫程式
 分解步驟:
1. 用矩形方式產生高度為 n 的山,即同時列印山的前後空格,
先以橫線替代。
2. 若 s 為山高到頂端距離,輸入 s,以矩形方式印出此山,
此矩形包含山高到頂端。以下為山高 n = 6 時, s 分別
為 1 與 2 的圖形。
-----/-----
----/**----
---/****---
--/******--
-/********-
/**********
> 1 > 2
---------- --------
----/---- --------
---/**--- ---/---
--/****-- --/**--
-/******- -/****-
/******** /******
山水圖案 (五)
113 用數學寫程式
3. 讓 s 由 0 1 2 依次變化,橫向印出三座山,相鄰兩山的空格暫以
不同符號替代,以資區分。
4. 設定 j 迴圈為 for j in range(-n+1,n) ,取其絕對值為 s,
仿上題印出所有的山,再加上兩排 ~ 底線即可完成程式。
-----/-----++++++++++--------
----/**----++++/++++--------
---/****---+++/**+++---/---
--/******--++/****++--/**--
-/********-+/******+-/****-
/**********/********/******
行道樹 (一)
123 用數學寫程式
行道樹 (二)
133 用數學寫程式
while True :
n = int( input("> ") )
a = 3 * n + 2
for i in range(a) :
for j in range(-n+1,n) :
s = abs(j) # 樹與中間樹單位距離
f = n - s # 樹幹高
h = 2 * n + 1 - 2 * s # 樹身高
w = 4 * ( n - s ) + 1 # 樹身底寬
d = 3 * s # 樹稍與頂部距離
if i < d :
print( " "*w , end=" " )
elif i < d+h :
print( " "*(d+h-i-1)+"*"*(2*(i-d)+1)+" "*(d+h-i-1) , end=" " )
elif i < d+h+f :
print( " "*(2*(n-s))+"|"+" "*(2*(n-s)) , end=" " )
else :
print( "="*(2*(n-s))+"="+"="*(2*(n-s)) , end=("=" if j<n-1 else " ") )
print()
print()
行道樹 (三)
143 用數學寫程式
 推導過程:
此題表面上看起來與數學無關,倒像一個刁難程式設計題目。但若將問題
看成數學題目,就是一個簡單數學問題。舉例來說:讓 n 代表由最左
邊最矮的樹到中間最高的樹的數量,同時再以中間樹為標準,緊鄰的左
右兩旁的樹與中間樹差距為 1,再兩旁則為 2,將此數設為 s,如下圖:
行道樹 (四)
153 用數學寫程式
讓 f 函數代表樹幹長,h 函數為樹身高,w 函數為樹身底部寬,
d 函數為樹梢與頂部的距離,這些函數若分別以 n 與 s 表示各
為何?
當程式問題改成數學題目後,大概都可立即推導出:
f(n,s) = n - s
h(n,s) = 2 n + 1 - 2 s
w(n,s) = 4 ( n - s ) + 1
d(n,s) = 3 s
行道樹 (五)
163 用數學寫程式
包圍每棵樹的矩形高 = f + h + d = n − s + 2n + 1 − 2s + 3s
= 3n + 1,再加上底部等號線就是 3n+2,也就是縱向迴圈執行次數。
函式推導出來後,轉換為程式就簡單了。
列印時每棵樹都被看成矩形,樹體以外的空格暫以橫線替代,由下圖可知
本題的撰寫方式如同上題一樣。
本題需要應用「數學思維」才能解決程式設計 !!
----- --------- ------*------ --------- -----
----- --------- -----***----- --------- -----
----- --------- ----*****---- --------- -----
----- ----*---- ---*******--- ----*---- -----
----- ---***--- --*********-- ---***--- -----
----- --*****-- -***********- --*****-- -----
--*-- -*******- ************* -*******- --*--
-***- ********* ------|------ ********* -***-
***** ----|---- ------|------ ----|---- *****
| ----|---- ------|------ ----|---- |
=============================================

Ch3 教學

  • 1.
    第 三 講 用數 學 寫 程 式 python 程式設計 python 簡要講義 國立中央大學數學系 吳維漢
  • 2.
    學好程式的關鍵 : 善用數學推導 2 先想清楚再動手撰寫  利用數學思維於紙筆上推導  將複雜問題簡化成系列的漸進式題組,然後逐步克服  與人討論可破除思考盲點,但程式仍需自己完成  寫程式通常會出錯,很少有一路順利完成程式  留意解譯器產生的錯誤訊息  看懂他人程式後,冷卻後重頭撰寫  試著變化已完成的程式問題,再次練習  多多找尋題目挑戰自己  精神不濟時避免練習程式,徒然浪費時間  學好程設就要經常練習,別無他法  https://stackoverflow.com/ 3 用數學寫程式
  • 3.
  • 4.
    三角數字塔 (二) 43 用數學寫程式 whileTrue : n = int( input("> ") ) # 大縱向 for s in range(n) : # 小縱向 for i in range(n) : print( " "*((n-1-s)*n) , end="" ) # 大橫向 for t in range(s+1) : print( " "*(n-1-i)+str(i+1)*(2*i+1)+ " "*(n-1-i) , end="" ) print() print() 當程式問題有些複雜,找不出清楚的規律,此時可將問題簡化到可完成的小問題, 然後由此小問題逐步加入條件,循序漸進完成程式設計。
  • 5.
    三角數字塔 (三) 53 用數學寫程式 分解步驟: 1.列印一個數字三角形,但將三角形當成矩形列印,也就是包含 數字前後的空格,先以橫線替代,以下 n = 4 為例: 2.列印一排數字矩形: ---1--- --222-- -33333- 4444444 ---1--- ---1--- ---1--- ---1--- --222-- --222-- --222-- --222-- -33333- -33333- -33333- -33333- 4444444 4444444 4444444 4444444
  • 6.
    三角數字塔 (四) 63 用數學寫程式 3.列印n 排數量遞增的數字矩形: ---1--- --222-- -33333- 4444444 ---1--- ---1--- --222-- --222-- -33333- -33333- 4444444 4444444 ---1--- ---1--- ---1--- --222-- --222-- --222-- -33333- -33333- -33333- 4444444 4444444 4444444 ---1--- ---1--- ---1--- ---1--- --222-- --222-- --222-- --222-- -33333- -33333- -33333- -33333- 4444444 4444444 4444444 4444444 4.在每排數字矩形之前增加若干個空格, 以星號替代。 ************---1--- ************--222-- ************-33333- ************4444444 ********---1--- ---1--- ********--222-- --222-- ********-33333- -33333- ********4444444 4444444 ****---1--- ---1--- ---1--- ****--222-- --222-- --222-- ****-33333- -33333- -33333- ****4444444 4444444 4444444 ---1--- ---1--- ---1--- ---1--- --222-- --222-- --222-- --222-- -33333- -33333- -33333- -33333- 4444444 4444444 4444444 4444444
  • 7.
  • 8.
    山水圖案 (二) 83 用數學寫程式 whileTrue : n = int( input("> ") ) # 山 for i in range(n) : for j in range(-n+1,n) : s = abs(j) # 山高至頂端距離 h = n - s # 山高 w = 2 * ( n - abs(j) ) # 山寬 t = i - s # 山頂往下距離 if i < s : print( " "*w , end="" ) else : print( " "*(n-1-i)+"/"+"*"*(2*t)+""+ " "*(n-1-i) , end="" ) print()
  • 9.
    山水圖案 (三) 93 用數學寫程式 #水 for i in range(2) : for j in range(-n+1,n) : w = 2*(n-abs(j)) print( "~"*w , end="" ) print() print()
  • 10.
    山水圖案 (四) 103 用數學寫程式 分解步驟: 1. 用矩形方式產生高度為 n 的山,即同時列印山的前後空格, 先以橫線替代。 2. 若 s 為山高到頂端距離,輸入 s,以矩形方式印出此山, 此矩形包含山高到頂端。以下為山高 n = 6 時, s 分別 為 1 與 2 的圖形。 -----/----- ----/**---- ---/****--- --/******-- -/********- /********** > 1 > 2 ---------- -------- ----/---- -------- ---/**--- ---/--- --/****-- --/**-- -/******- -/****- /******** /******
  • 11.
    山水圖案 (五) 113 用數學寫程式 3.讓 s 由 0 1 2 依次變化,橫向印出三座山,相鄰兩山的空格暫以 不同符號替代,以資區分。 4. 設定 j 迴圈為 for j in range(-n+1,n) ,取其絕對值為 s, 仿上題印出所有的山,再加上兩排 ~ 底線即可完成程式。 -----/-----++++++++++-------- ----/**----++++/++++-------- ---/****---+++/**+++---/--- --/******--++/****++--/**-- -/********-+/******+-/****- /**********/********/******
  • 12.
  • 13.
    行道樹 (二) 133 用數學寫程式 whileTrue : n = int( input("> ") ) a = 3 * n + 2 for i in range(a) : for j in range(-n+1,n) : s = abs(j) # 樹與中間樹單位距離 f = n - s # 樹幹高 h = 2 * n + 1 - 2 * s # 樹身高 w = 4 * ( n - s ) + 1 # 樹身底寬 d = 3 * s # 樹稍與頂部距離 if i < d : print( " "*w , end=" " ) elif i < d+h : print( " "*(d+h-i-1)+"*"*(2*(i-d)+1)+" "*(d+h-i-1) , end=" " ) elif i < d+h+f : print( " "*(2*(n-s))+"|"+" "*(2*(n-s)) , end=" " ) else : print( "="*(2*(n-s))+"="+"="*(2*(n-s)) , end=("=" if j<n-1 else " ") ) print() print()
  • 14.
    行道樹 (三) 143 用數學寫程式 推導過程: 此題表面上看起來與數學無關,倒像一個刁難程式設計題目。但若將問題 看成數學題目,就是一個簡單數學問題。舉例來說:讓 n 代表由最左 邊最矮的樹到中間最高的樹的數量,同時再以中間樹為標準,緊鄰的左 右兩旁的樹與中間樹差距為 1,再兩旁則為 2,將此數設為 s,如下圖:
  • 15.
    行道樹 (四) 153 用數學寫程式 讓f 函數代表樹幹長,h 函數為樹身高,w 函數為樹身底部寬, d 函數為樹梢與頂部的距離,這些函數若分別以 n 與 s 表示各 為何? 當程式問題改成數學題目後,大概都可立即推導出: f(n,s) = n - s h(n,s) = 2 n + 1 - 2 s w(n,s) = 4 ( n - s ) + 1 d(n,s) = 3 s
  • 16.
    行道樹 (五) 163 用數學寫程式 包圍每棵樹的矩形高= f + h + d = n − s + 2n + 1 − 2s + 3s = 3n + 1,再加上底部等號線就是 3n+2,也就是縱向迴圈執行次數。 函式推導出來後,轉換為程式就簡單了。 列印時每棵樹都被看成矩形,樹體以外的空格暫以橫線替代,由下圖可知 本題的撰寫方式如同上題一樣。 本題需要應用「數學思維」才能解決程式設計 !! ----- --------- ------*------ --------- ----- ----- --------- -----***----- --------- ----- ----- --------- ----*****---- --------- ----- ----- ----*---- ---*******--- ----*---- ----- ----- ---***--- --*********-- ---***--- ----- ----- --*****-- -***********- --*****-- ----- --*-- -*******- ************* -*******- --*-- -***- ********* ------|------ ********* -***- ***** ----|---- ------|------ ----|---- ***** | ----|---- ------|------ ----|---- | =============================================