編碼也快樂:兩隻水壺F#程式
F# 是微軟 .NET 戰略的一門重要語言,中文的 F# 書籍很少,賈洪峰老師翻譯了一本《C# 與 F# 程式設計實踐》。期望圖靈公司能引進優秀入門教程 Programming F# 3.0,封面故事: http://www.ituring.com.cn/article/31648,封面圖片見文末。
言歸正傳,解釋一下我的 F# 程式(參加編碼也快樂活動第三波):
主函式 pot 的三個引數 t a b 分別是目標水量及兩個壺的容量。
函式 solve 用於解題,引數 p q 是兩個壺的當前水量。
函式第一行列印當前水量;
如果當前水量等於目標水量,成功;
否則,如果 A 壺空,則裝滿它;
否則,如果 B 壺滿,則清空它;
否則,儘可能地從 A 壺往 B 壺倒水;
遞迴地呼叫以上步驟即可完成解題。
函式 gcd 用歐幾里得演算法求兩個整數的最大公約數。
主函式 pot 的第一行首先判斷輸入的引數 t a b 是否超出允許範圍;
接著根據目標水量是不是兩個壺的容量的最大公約數的倍數判斷是否有解;
現在可以置兩個壺的初始水量為零,呼叫函式 solve 0 0 開始解題。
let pot t a b =
let rec solve p q =
printfn " -> (%d, %d)" p q
if p = t || q = t then printfn "-------- OK! --------"
else if p = 0 then printf "Fill A full"; solve a q
else if q = b then printf "Empty pot B"; solve p 0
else
printf "Pour A to B"
let x = min p (b - q)
solve (p - x) (q + x)
let rec gcd a b = if b = 0 then a else gcd b (a % b)
if a<1 || b<1 || t<0 || t>a && t>b then printfn "Arg out of range."
else if t % (gcd a b) <> 0 then printfn "No solve!"
else printf "Start with "; solve 0 0
以目標水量 3,兩個壺的容量分別為 5 和 6 為引數呼叫 pot 的結果如下:
> pot 3 5 6;;
Start with -> (0, 0)
Fill A full -> (5, 0)
Pour A to B -> (0, 5)
Fill A full -> (5, 5)
Pour A to B -> (4, 6)
Empty pot B -> (4, 0)
Pour A to B -> (0, 4)
Fill A full -> (5, 4)
Pour A to B -> (3, 6)
-------- OK! --------
相關文章
- 幽默:我不是碼農,也不是一隻編碼猴子? - Bryan
- 水一貼,新年快樂!
- 買這家公司的遊戲,還不如買兩瓶快樂水?遊戲
- 使用 F# 編寫檔案處理程式
- 不再做夢,快樂程式碼到此為止!
- 程式設計師快樂器之JAVA程式碼生成工具程式設計師Java
- 任天堂傳奇社長巖田聰:讓自己快樂,也努力讓別人快樂
- 程式猿1024節快樂
- NEON彙編比純C程式碼快17倍!C程式
- 程式設計師節快樂程式設計師
- 祝office職場大學,兩週年生日快樂!
- 使用Google Guava快樂程式設計GoGuava程式設計
- 程式設計師的快樂生活程式設計師
- 22種程式語言新年快樂
- 通達信兩隻喜鵲指標公式原始碼副圖指標公式原始碼
- 程式設計師快樂撩妹秀技術兩不誤(行政財務拆分篇)程式設計師
- 「1024」專屬序猿的快樂,驚奇迷惑程式碼大賞
- 勞動節快樂!手寫個核心價值觀編碼工具 - Python實現Python
- 程式碼安全 兩種程式碼漏洞
- Zed:極快的開源協作程式碼編輯器IDEZedIDE
- 新年快樂!!!
- 快樂數
- 程式設計師入職三個月,竟一行程式碼都沒提交:我愛程式碼,程式碼使我快樂程式設計師行程
- nf-Press —— 線上文件也可以載入元件和編寫程式碼元件
- 你也許不知道的Vuejs – 使用ES6快樂的玩耍VueJS
- 程式設計師如何祝自己生日快樂程式設計師
- F#是當今最好的程式語言?
- 程式碼除錯技巧【OI縮水版】除錯
- 快樂數字
- 節日快樂~
- 《快樂電玩》
- 女神節快樂
- 聖誕快樂
- 如何簡單高效的在程式碼中實現兩級快取的管理快取
- 讓程式設計快樂起來的過程程式設計
- dotnet 透過 Elmish.WPF 使用 F# 編寫 WPF 應用
- 通義靈碼——靈動指間,快碼加編,你的智慧編碼助手
- 程式碼訓練營第6天 | 雜湊表 242.有效的字母異位詞 349.兩個陣列的交集 202.快樂數 1.兩數之和陣列
- Sublime 編寫編譯 swift程式碼編譯Swift