發表文章

目前顯示的是 2017的文章

[演算法] [C++ / Python] 深度優先搜尋 Depth-First-Search - Part I

圖片
更新:熱騰騰的 Part II 出爐囉! 深度優先搜尋 , Depth-First-Search,簡稱 DFS,是一種用於圖或樹的遍歷、搜尋演算法。 樹 我們先畫一棵樹如下:   是不是很繽紛呢(X 畫完樹之後,我們要選一個「起點」,在這裡我們選紅色 的   1 。接下來我們可以看到,有三個節點與 1 相連,分別是    2  ,    3  ,    4  。   接下來就是 DFS 的精華:先選一個節點「 深 」入研究,於是在這裡我們先選 2 來進行下一步。 選 2 之後呢?我們會把    2   當作新的起點,再做一次 DFS,因此我們找到了    5  。   糟了,以 5 為起點的話就找不到任何的節點了,這樣就結束了嗎?當然不是,這種情況下我們要返回到上一個節點,也就是 2,看看有沒有還沒去過的節點。   --也沒有,我們只好再回到 1,有了!剛剛先被我們放到一邊的 3 和 4,於是我們選擇    3   作為我們新 DFS 的起點。啊糟糕,原來 3 下面也沒有其他節點了XD    我們只好回到 1,去尋求 4 的幫助(?),我們以    4   為起點進行 DFS,發現有  6  跟    7   兩個節點;依據 DFS 的原則,先訪問其中一個,在這裡選 6,接著回到 4,再走到 7。   因為 7 後面沒有節點了,所以回到 4,再回到 1,結果發現 1 也沒了,因此,DFS 到此全部完畢。 程式碼實作 - C++ void dfs(Node* start){ if (start == nullptr){ // 如果這個位置沒有節點 return; // 返回上一個 } cout << start->data << " visited." << endl; for (int i = 0; i < 3; i++){ dfs(start->next[i]); // 分別以目前所找到的節點作為下一次 DFS 的起點 } } 這裡僅列出重點部分,完整程式碼請至 這裡 查看 程式碼實作 - Python def dfs(s

[C#] ZipFile 類別的使用

圖片
// 版本需求:.Net 4.5以上 有時我們會想把一些資料打包成 ZIP 壓縮檔,這時可以使用 ZipFile 類別。   如果要使用 ZipFile 類別,首先要在程式碼最上方加入: using System.IO; using System.IO.Compression;   然後就可以呼叫 ZipFile.CreateFromDirectory() 函式: ZipFile.CreateFromDirectory(source, destination)   其中的 source 是一個資料夾名,代表把那個資料夾下的所有檔案都加入壓縮檔,並存到 destination。這裡要 注意 的是:source 是資料夾(目錄)的路徑,而 destination 則是包含路徑的檔名。   現在只要把 source 和 destination 放進去就好了嗎? 錯!基本上大部分的人都會遇到一個問題:找不到 ZipFile 這個類別。 奇怪,我們剛剛不是用 using 引入需要的命名空間了嗎?為什麼還不行?   原來是因為我們目前的專案沒有參考到需要的組件- System.IO.Compression.FileSystem,那要怎麼加入?先在方案總管對專案名稱按右鍵,再選 加入 > 參考:   接下來會出現如下視窗,把 System.IO.Compression.FileSystem 打勾:   按下確定就 OK 了。 實際應用 比如說想讓使用者能把目前應用程式的設定值匯出,就可以用到 ZipFile: private void Button8_Click(object sender, EventArgs e) // 「匯出」這個按鈕 { if (saveFileDialog2.ShowDialog() == DialogResult.OK) { string fname = saveFileDialog2.FileName; ZipFile.CreateFromDirectory(path, fname); System.Threading.Thread.Sleep(500); Process.Start("C:

[Python] 淺談字元碼位 (Code Point) 及相關函式

字元碼位?就是每個字元的編碼位置,可以想成是每個字元的身分證,只要知道那個字元,就能知道它的碼位;反之亦然。 雖然目前有這麼多種編碼,而每種編碼中的碼位都不同,我們應該每種都學嗎?幸運的是 Python 3 把字串跟 Unicode 做了整合,所以我們接下來所談的部分會專注於 Unicode 這個編碼上。 ord() 與 chr() 在 Python 中,可以使用 ord() 函式取得某個字元的碼位: print(ord('1')) # 49 print(ord('N')) # 78 print(ord('你')) # 20320 然後我們可以把這個碼位丟進 chr() 函式獲取該碼位的字元: print(chr(49)) # '1' print(chr(78)) # 'N' print(chr(20320)) # '你' 請配著上面的範例食用(?) 轉義-使用碼位 可能有人會看過什麼 \???、\x??、\u???? 之類的東西,可是看都看不懂,這其實是使用了碼位來進行字串的轉義,我們來看看 Python 中 Unicode 字元的轉義: \ _ _ _:以8進位的碼位來表示字元,最多3位數 \x_ _:以16進位的碼位來表示字元,基本上2位數 \u_ _ _ _:以16位元的16進位數值代表碼位 \U_ _ _ _ _ _ _ _:同上,只是這是32位元的數值 print('\116') # 116(8) == 78(10) # N print('\x31') # 31(16) == 49(10) # 1 print('\u4F60') # 4F60(16) == 20320(10) # '你' print('\U00004F60') # '你'

[Python 3.6] 初探格式化字串實字 (Formatted string literals)

Formatted string literals ,我暫時翻譯成 格式化字串實字 ,是 Python 在 3.6版加入的新特色,這個功能源自於 PEP 中的 498號提案 ,而這個特色又被稱作 f-string ,讓我們來看看要怎麼使用吧: name = 'Sky' print(f'My name is {name}.') # 'My name is Sky.' 有看到單引號前的 f 嗎?那是表示這個字串中會包含需要被取代的部分(F 也可以),然後讓我們看看字串中間的 左大括號 ,這是取代欄位的開始,右大括號則是標示出了這個欄位的結束。 Replacement field  取代欄位 在這個欄位中,基本上可以放入任何 Python表示式,甚至包含 lambda 函式: myNumber = 5 print(f'''My number is a {(lambda n: "Lucky" if n % 3 == 0 else "Unlucky")(myNumber)} number.''') # My number is a # Unlucky number. 需要注意的是:lambda 主體需要以 ( ) 小括號包住,否則會引起 SyntaxError 例外;這裡同時展現了 f-string 另一個特色:可以像我們平常使用字串時那樣以三個引號表達多行字串,同樣地,任何空白字元都會被包起來,成為字串的一部分。 小問題 如果你寫了一行這樣的程式碼: print(f'"{" is a opening curly bracket.') # File "<stdin>", line 1 # SyntaxError: f-string: unterminated string 會發現說 引起了 SyntaxError 例外,為什麼呢? 應該很淺顯易懂,左大括號代表的是一個欄位的起點,所以上述的例子中,Python直譯器會找不到 代表結束的 右大括號。 那如果字串中需要一個真正的左 / 右大括號呢?  可以使用{{ 或 }},將