More Related Content More from Alisha Smile (20) Ch31. 第 三 講
用 數 學 寫 程 式
python 程式設計
python 簡要講義
國立中央大學數學系 吳維漢
2. 學好程式的關鍵 : 善用數學推導
2
先想清楚再動手撰寫
利用數學思維於紙筆上推導
將複雜問題簡化成系列的漸進式題組,然後逐步克服
與人討論可破除思考盲點,但程式仍需自己完成
寫程式通常會出錯,很少有一路順利完成程式
留意解譯器產生的錯誤訊息
看懂他人程式後,冷卻後重頭撰寫
試著變化已完成的程式問題,再次練習
多多找尋題目挑戰自己
精神不濟時避免練習程式,徒然浪費時間
學好程設就要經常練習,別無他法
https://stackoverflow.com/
3 用數學寫程式
4. 三角數字塔 (二)
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()
當程式問題有些複雜,找不出清楚的規律,此時可將問題簡化到可完成的小問題,
然後由此小問題逐步加入條件,循序漸進完成程式設計。
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
8. 山水圖案 (二)
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()
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,
仿上題印出所有的山,再加上兩排 ~ 底線即可完成程式。
-----/-----++++++++++--------
----/**----++++/++++--------
---/****---+++/**+++---/---
--/******--++/****++--/**--
-/********-+/******+-/****-
/**********/********/******
13. 行道樹 (二)
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()
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,也就是縱向迴圈執行次數。
函式推導出來後,轉換為程式就簡單了。
列印時每棵樹都被看成矩形,樹體以外的空格暫以橫線替代,由下圖可知
本題的撰寫方式如同上題一樣。
本題需要應用「數學思維」才能解決程式設計 !!
----- --------- ------*------ --------- -----
----- --------- -----***----- --------- -----
----- --------- ----*****---- --------- -----
----- ----*---- ---*******--- ----*---- -----
----- ---***--- --*********-- ---***--- -----
----- --*****-- -***********- --*****-- -----
--*-- -*******- ************* -*******- --*--
-***- ********* ------|------ ********* -***-
***** ----|---- ------|------ ----|---- *****
| ----|---- ------|------ ----|---- |
=============================================
18. 習題 1
輸入數字 n 印出以下圖形:
183 用數學寫程式
> 3 > 4
1 1
1 1 1 1
11111 1 1
1 2 1111111
1 1 2 2 1 2
11111 22222 1 1 2 2
1 2 3 1 1 2 2
1 1 2 2 3 3 1111111 2222222
11111 22222 33333 1 2 3
1 1 2 2 3 3
1 1 2 2 3 3
1111111 2222222 3333333
1 2 3 4
1 1 2 2 3 3 4 4
1 1 2 2 3 3 4 4
1111111 2222222 3333333 4444444
19. 習題 2
輸入數字 n 印出以下底部重疊的雙三角形:
193 用數學寫程式
> 4
1 1
222 222
33333 33333
4444444 4444444
1 1 1 1
222 222 222 222
33333 33333 33333 33333
4444444 4444444 4444444 4444444
1 1 1 1 1 1
222 222 222 222 222 222
33333 33333 33333 33333 33333 33333
4444444 4444444 4444444 4444444 4444444 4444444
1 1 1 1 1 1 1
222 222 222 222 222 222 222
33333 33333 33333 33333 33333 33333 33333
4444444 4444444 4444444 4444444 4444444 4444444 4444444
20. > 3
1 1
2 2 2 2
33333 33333
1 1 1 1
2 2 2 2 2 2 2 2
33333 33333 33333 33333
1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
33333 33333 33333 33333 33333
2 2 2 2 2 2 2 2 2 2
1 1 1 1 1
33333 33333 33333 33333
2 2 2 2 2 2 2 2
1 1 1 1
33333 33333
2 2 2 2
1 1
習題 3
203 用數學寫程式
輸入數字 n 印出以下重疊的空心鑽石圖案:
21. 習題 4
輸入數字 n 印出以下空心鑽石圖案:
213 用數學寫程式
> 3 > 4
1 1
2 2 2 2
33333 3 3
1 1 4444444
2 2 2 2 1 1
33333 33333 2 2 2 2
1 1 3 3 3 3
2 2 2 2 4444444 4444444
33333 33333 1 1
2 2 2 2 2 2 2 2
1 1 3 3 3 3
33333 33333 4444444 4444444
2 2 2 2 1 1
1 1 2 2 2 2
33333 3 3 3 3
2 2 4444444 4444444
1 3 3 3 3
2 2 2 2
1 1
4444444 4444444
3 3 3 3
2 2 2 2
1 1
4444444 4444444
3 3 3 3
2 2 2 2
1 1
4444444
3 3
2 2
1
22. 習題 5
撰寫程式印出由左到右遞增的金字塔方塊圖案,
每個方塊高為 3 ,寬為 5 :
223 用數學寫程式
> 2 > 3
11111 11111
11111 11111
11111 11111
11111 22222 22222 11111 22222 22222
11111 22222 22222 11111 22222 22222
11111 22222 22222 11111 22222 22222
11111 22222 22222 33333 33333 33333
11111 22222 22222 33333 33333 33333
11111 22222 22222 33333 33333 33333
23. 習題 6
參考上題已知,撰寫程式印出以下對稱圖案:
233 用數學寫程式
> 3
11111
11111
11111
11111 22222 22222 11111
11111 22222 22222 11111
11111 22222 22222 11111
11111 22222 22222 33333 33333 33333 22222 22222 11111
11111 22222 22222 33333 33333 33333 22222 22222 11111
11111 22222 22222 33333 33333 33333 22222 22222 11111
11111 22222 22222 11111
11111 22222 22222 11111
11111 22222 22222 11111
11111
11111
11111
24. 習題 7
撰寫程式輸入數字印出以下的窗櫺圖案:
243 用數學寫程式
> 3 > 4
||||||||/|||||||| |||||||||||||||/|||||||||||||||
|||/||/ ||/||| ||||||||/||||/ ||||/||||||||
// / / / |||/||/ ||/ ||/ ||/|||
/ / / // // / / / / /
|||/|| /||/||| / / / / / //
||||||||/|||||||| |||/|| /|| /|| /||/|||
||||||||/|||| /||||/||||||||
|||||||||||||||/|||||||||||||||
25. 習題 8
如何修改上題程式,印出以下先由大到小,後由小到大的
窗櫺圖案:
253 用數學寫程式
> 5
||||/||||||||||||||||||||||||||||||||||||||||||||||/||||
|||/ ||||||/||||||||||||||||||||||||||||/||||||/ |||
||/ ||||/ ||||/||||||||||||||/||||/ ||||/ ||
|/ ||/ ||/ ||/||||/||/ ||/ ||/ |
/ / / / // / / /
/ / / // / / / /
| /|| /|| /||/||||/|| /|| /|| /|
|| /|||| /||||/||||||||||||||/|||| /|||| /||
||| /||||||/||||||||||||||||||||||||||||/|||||| /|||
||||/||||||||||||||||||||||||||||||||||||||||||||||/||||
27. 習題 10
撰寫程式,輸入數字 n 印出以下圖案:
273 用數學寫程式
> 3 > 4
3 3 3 4 4 4 4
2 2 3 3 3 2 2 3 3 3 4 4 4 4 3 3 3
1 2 2 3 3 3 2 2 1 2 2 3 3 3 4 4 4 4 3 3 3 2 2
1 2 2 3 3 3 2 2 1 1 1 2 2 3 3 3 4 4 4 4 3 3 3 2 2 1
2 2 3 3 3 2 2 1 1 2 2 3 3 3 4 4 4 4 3 3 3 2 2 1
3 3 3 2 2 3 3 3 4 4 4 4 3 3 3 2 2
3 3 3 4 4 4 4 3 3 3
4 4 4 4
28. 習題 11
參考上題,輸入數字 n 印出以下類似燈籠圖案:
283 用數學寫程式
> 5 > 6
55555 666666
4444-----4444 55555------55555
333-------------333 4444----------------4444
22-------------------22 333------------------------333
1-----------------------1 22------------------------------22
1-----------------------1 1----------------------------------1
22-------------------22 1----------------------------------1
333-------------333 22------------------------------22
4444-----4444 333------------------------333
55555 4444----------------4444
55555------55555
666666
29. 習題 12
撰寫程式輸入奇數印出以下 X 方塊圖案:
293 用數學寫程式
> 3 > 5
333 333 555 555
333 333 555 555
333 333 555 555
333 555 555
333 555 555
333 555 555
333 333 555
333 333 555
333 333 555
555 555
555 555
555 555
555 555
555 555
555 555
30. 習題 13
撰寫程式輸入數字印出以下不同放大程度的「中」字圖案:
303 用數學寫程式
> 1 > 2
央 央央
央 央央
央央央央央 央央
央 央 央 央央
央央央央央 央央央央央央央央央央
央 央央央央央央央央央央
央 央央 央央 央央
央央 央央 央央
央央央央央央央央央央
央央央央央央央央央央
央央
央央
央央
央央
提示:設定座標,使用數學方程式表示「中」的各個筆劃
31. 習題 14
輸入數字 2 水平點數,利用方程式建構 2 的筆劃印出以下 2 中有 2 的圖案:
313 用數學寫程式
32. 習題 15
修改行道樹範例使得印出的行道樹由高到矮兩兩排列:
323 用數學寫程式
> 3
* *
*** ***
***** *****
******* ******* * *
********* ********* *** ***
*********** *********** ***** *****
************* ************* ******* ******* * *
| | ********* ********* *** ***
| | | | ***** *****
| | | | | |
===========================================================
33. 習題 16
修改行道樹範例印出行道樹的倒影:
333 用數學寫程式
> 3
*
***
*****
* ******* *
*** ********* ***
***** *********** *****
* ******* ************* ******* *
*** ********* | ********* ***
***** | | | *****
| | | | |
---------------------------------------------
***** *****
*** ********* ********* ***
* ******* ************* ******* *
***** *********** *****
*** ********* ***
* ******* *
*****
***
*