Re: [討論] 程式設計師,好吃技術的職業喔!

看板Soft_Job (軟體人)作者 (十年一夢)時間17年前 (2008/12/28 11:16), 編輯推噓16(16051)
留言67則, 8人參與, 最新討論串12/19 (看更多)
舉個我認為不必多加else的case given n, 計算1~n當中哪個數的因數最多, 可用int CountDivisor(int x)會傳回x有幾個因數. int MostDivisor(int n) { int ans=1, max=1; int i; if(n<1) { return -1; //unexpected input }else { for(i=1; i<=n; i++) { if(CountDivisor(i)>max) { ans=i; max=CountDivisor(i); } } } return ans; } 先不要計較CountDivisor被叫了兩次之類我的寫法不好的問題. 這pattern是: "sequentially看過所有可能並且找出最大值" 找最大值這件事情就會有上面這段code裡面藍色底黑字的那個if 這裡我認為沒有必要加上else, 因為他的語意本來就是只有在找到更大的值的時候 update資訊, 沒有找到更大的值的時候當然什麼也不做. 要嚴謹, 你可以在loop裡面或if裡面加上assertion, 可以在if裡面print debug message. 加上一個空的else能幫助我什麼呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.226.5

12/28 11:18, , 1F
max = max2(max, CountDivisor(i));
12/28 11:18, 1F

12/28 11:21, , 2F
XD
12/28 11:21, 2F

12/28 11:23, , 3F
樓上.....這離題了吧而且這樣不知道到底是哪一項是max,
12/28 11:23, 3F

12/28 11:23, , 4F
只知道max多少
12/28 11:23, 4F

12/28 11:24, , 5F
我的確是來亂的 XD
12/28 11:24, 5F

12/28 11:24, , 6F
在這裡認真就輸了.... Orz
12/28 11:24, 6F

12/28 11:26, , 7F
而且你用macro的話, preproccesor展開他還是被叫兩次...
12/28 11:26, 7F

12/28 11:28, , 8F
你好認真喔 .. Orz 不能用 inline function 嗎?
12/28 11:28, 8F

12/28 12:01, , 9F
很少看到有人if-else是這樣縮排的..
12/28 12:01, 9F

12/28 12:02, , 10F
沒有找到更大的值的時候當然什麼也不做 這句就是else
12/28 12:02, 10F

12/28 12:04, , 11F
那加上else可以有什麼幫助?
12/28 12:04, 11F

12/28 12:04, , 12F
連中文語意都有else了.你的觀點只是空的所以不用寫罷了
12/28 12:04, 12F

12/28 12:04, , 13F
如果你確定code永遠是你在maintain.我覺得不加fine
12/28 12:04, 13F

12/28 12:05, , 14F
但以寫HDL的人來說..加不加else會變成不同的電路
12/28 12:05, 14F

12/28 12:05, , 15F
如果不用寫else就表示有else, 那為什麼會有沒寫的問題XD?
12/28 12:05, 15F

12/28 12:05, , 16F
人的思考邏輯的確是靈活的..你知道為什麼不加
12/28 12:05, 16F

12/28 12:06, , 17F
你不能拿某種語言的特性來類比一般原則, 這是過度推論啊-_-
12/28 12:06, 17F

12/28 12:06, , 18F
程式碼是給電腦跑的.電腦的邏輯卻是follow build rule
12/28 12:06, 18F

12/28 12:07, , 19F
我沒有過度推論也沒說"一定要加" 你延伸想太多了哦
12/28 12:07, 19F

12/28 12:08, , 20F
我再強調一次我的觀點..我不反對不加else
12/28 12:08, 20F

12/28 12:08, , 21F
但用人的思考邏輯去套用CPU的思考模式應該不是正確的
12/28 12:08, 21F

12/28 12:08, , 22F
那要問問發文的是不是這樣想啦........
12/28 12:08, 22F

12/28 12:09, , 23F
所以有的時候,別人的吹毛求疵不一定不是專業。
12/28 12:09, 23F

12/28 12:10, , 24F
例如大部分人不用考慮 CPU 的 instruction set
12/28 12:10, 24F

12/28 12:10, , 25F
不代表這件事完全不用考慮…
12/28 12:10, 25F

12/28 12:10, , 26F
我覺得這沒什麼好爭的人家公司要加有他的考量在
12/28 12:10, 26F

12/28 12:11, , 27F
發文那個不是javascript嗎? jsp的if statement和if-else
12/28 12:11, 27F

12/28 12:11, , 28F
statement沒有verilog裡這種區別吧
12/28 12:11, 28F

12/28 12:12, , 29F
我相信不管任何程式都是經過CPU運算
12/28 12:12, 29F

12/28 12:13, , 30F
我個人傾向尊重看似聰明卻一板一眼的CPU
12/28 12:13, 30F

12/28 12:14, , 31F
..... 如果在寫assembly那我當然要考慮用哪種方式branch
12/28 12:14, 31F

12/28 12:14, , 32F
甚至比較常發生的case要擺在if 還是擺在else 都要考慮
12/28 12:14, 32F

12/28 12:15, , 33F
可是 我來查查C++ Coding Standards - 101 Rules, Guide-
12/28 12:15, 33F

12/28 12:16, , 34F
lines, and Best Practices裡相關的說法...
12/28 12:16, 34F

12/28 12:16, , 35F
我突然很想推一句話:「jsp不是javascript...」XD
12/28 12:16, 35F

12/28 12:20, , 36F
嘎 抱歉 我承認我只會C
12/28 12:20, 36F

12/28 12:20, , 37F
順問一下,CountDivisor會不會因為i過大而return null?
12/28 12:20, 37F

12/28 12:22, , 38F
記得是 depend on compiler implementation
12/28 12:22, 38F

12/28 12:23, , 39F
(1)看CountDivisor怎麼設計(2)對正整數n,他的因數個數必
12/28 12:23, 39F

12/28 12:23, , 40F
<=n
12/28 12:23, 40F

12/28 12:26, , 41F
(1)要如何確保不是CountDivisor出問題(2)n可能已經溢位
12/28 12:26, 41F

12/28 12:27, , 42F
,這樣的思考邏輯就無法確保。
12/28 12:27, 42F

12/28 12:27, , 43F
或者,若CountDivisor也有可能在異常下 return -1
12/28 12:27, 43F

12/28 12:28, , 44F
則如何判斷是n造成,還是CountDivisor造成?
12/28 12:28, 44F

12/28 12:29, , 45F
這個程式要怎麼refine refactory空間很大, 但是在if後面
12/28 12:29, 45F

12/28 12:29, , 46F
加else能解決樓上這個問題嗎?
12/28 12:29, 46F

12/28 12:30, , 47F
你可以在for loop裡面print CountDivisor(i)出來...
12/28 12:30, 47F

12/28 12:32, , 48F
其實還要考慮你環境裏軟硬體可能還有浮點計算錯誤的問題
12/28 12:32, 48F

12/28 12:33, , 49F
防錯處理不能幫你解決,只是在萬一真的發生時,
12/28 12:33, 49F

12/28 12:33, , 50F
能讓你意識到這個點可能有問題。
12/28 12:33, 50F

12/28 12:34, , 51F
每個函數自己要把自己範圍內的事情顧好 在這個函數裡n沒
12/28 12:34, 51F

12/28 12:34, , 52F
被動過, i只是iterator, 會不會溢位無從得知要看caller
12/28 12:34, 52F

12/28 12:34, , 53F
for loop裏print debug也是種作法,但是本例裏習慣上就
12/28 12:34, 53F

12/28 12:35, , 54F
每個人寫的unit要自己作好測試才是根本
12/28 12:35, 54F

12/28 12:35, , 55F
是沒有。不管是print debug或 with else,當你沒有這種
12/28 12:35, 55F

12/28 12:36, , 56F
習慣,就不應該宣稱這種習慣是多餘的
12/28 12:36, 56F

12/28 12:36, , 57F
不用挑我沒加debug message來說我沒有這種習慣 我只是要
12/28 12:36, 57F

12/28 12:37, , 58F
舉出這個pattern來 難道我要擴充到兩頁長的完整code
12/28 12:37, 58F

12/28 12:37, , 59F
我的問題很簡單 你說的議題都很重要我跟你立場相同 但是
12/28 12:37, 59F

12/28 12:38, , 60F
這個case裡面 這個if後面加上空else可以帶來的幫助我不懂
12/28 12:38, 60F

12/28 12:38, , 61F
如果CountDivisor不是你寫的,就不要對它太有自信
12/28 12:38, 61F

12/28 12:38, , 62F
所以願聞其詳
12/28 12:38, 62F

12/28 12:40, , 63F
不是要加上空的else,加上else當然是要作點事情
12/28 12:40, 63F

12/28 12:41, , 64F
你講的print debug 不就是?
12/28 12:41, 64F

12/28 12:42, , 65F
那要print什麼出來 是只有在else的case才有必要print的?
12/28 12:42, 65F

12/28 12:42, , 66F
loop一進來就可以print了
12/28 12:42, 66F

12/28 13:15, , 67F
這個例子用 assertion 就可以了
12/28 13:15, 67F
文章代碼(AID): #19Lk-H4u (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #19Lk-H4u (Soft_Job)