2019年6月18日,Facebook發佈了數字貨幣Libra的技術白皮書,我也第一時間體驗了一下它的智能合約編程語言MOVE,發現這個MOVE是用Rust編寫的,看來想準確理解MOVE的機制,還須要對Rust有深入的理解,因此又開始了Rust的快速入門學習。git
看了一下網上有關Rust的介紹,都說它的學習曲線至關陡峭,曾一度被其嚇着,後來發現Rust借鑑了Haskell等函數式編程語言的優勢,而我之前專門學習過Haskell,通過一段時間的入門學習,我如今已經喜歡上這門神奇的語言。github
入門資料我用官方的《The Rust Programming Language》,很是權威,配合着《Rust by example》這本書一塊兒學習,效果很是不錯。算法
學習任何一項技能最怕沒有反饋,尤爲是學英語、學編程的時候,必定要「用」,學習編程時有一個很是有用的網站,它就是「歐拉計劃」,網址:https://projecteuler.net編程
若是你的英文不過關,有人已經將幾乎全部的題目翻譯成了中文,網址:http://pe-cn.github.io,本書中的許多題目的描述都照搬了該網站的翻譯。數組
歐拉計劃提供了幾百道由易到難的數學問題,你能夠用任何辦法去解決它,固然主要還得靠編程,但編程語言不限,已經有Java、C#、Python、Lisp、Haskell等各類解法,固然直接用google搜索答案就沒什麼樂趣了。緩存
學習Rust最好先把基本的語法和特性看過一遍,而後就能夠動手解題了,解題的過程就是學習、試錯、再學習、掌握和鞏固的過程,學習進度會大大加快。編程語言
歐拉計劃中的各題都標出了難度係數,以百分數來表示,5%是其中難度最低的,難度最高的爲100%,截止到2019年10月10日,難題係數爲5%的題共有63道,能夠做爲Rust的入門練手題。函數式編程
這些初級難度的題目,主要涉及整除性質、素數、因子、分數、迴文數、階乘、三角數、大整數、數字序列、路徑計算、日期、全排列、組合數、初級密碼學等方面,經過解這些題,能夠了解Rust中的基本數據類型,向量用法,理解Rust中特有的全部權體系,體會函數式編程的思惟等。函數
在歐拉計劃的官網上註冊帳號後,若是得出了某題的正確答案,能夠在論壇裏參與相關的討論,看看其餘人的解題思路和源代碼,得到一些靈感。工具
下面我把63道題分爲幾大類,經過研究這些題的解法,我學會了Rust的哪些知識點。
這一部分題型相對簡單,能夠了解Rust的基本數據類型,整數運算、文件讀取和字符串操做。
主要的語法知識點:
根據必定的規則,一個數字能夠變換爲另外一個數字,但最後會收斂到一個特定的值。
主要的語法知識點:
一個數有質因子,真因子等概念,而後引出了親和數、盈數等有趣的數字。
主要的語法知識點:
歐拉是一個數學家,因此歐拉計劃中題型以數學題爲主,而其中與素數有關的問題特別多。
主要的語法或算法:
勾股數、冪運算、階乘、迴文等一些數字遊戲。
主要的語法知識點:
各類編程語言一般都提供64位的整數,表示的最大值爲18446744073709551615,也只有20位數字。對於超過這個範圍的整數,日常的數據類型就沒法進行運算,這時須要用到大整數函數庫num-bigint。
主要的語法知識點:
求不一樣的路徑或者最大路徑,學習遞歸算法和改進算法。
主要的語法和算法:
只有一道涉及日期的計算。
主要的語法知識點:
學習全排列的幾種生成算法。
主要的語法和算法:
分數能夠表示爲無限循環小數,不斷試除和取餘來找循環節。
主要的語法知識點:
根據一個函數能夠生成一系列的整數。
主要的語法或算法:
這裏有兩道初級的黑客問題。
主要的語法知識點:
一、刷題容易上癮
一開始解題是想快速掌握Rust的語法,前面進展較慢,由於語法不熟,須要邊看Rust編程書,邊google,邊試驗才能解決一道題。
在完成了30題左右以後,有點遊戲闖關上癮的感受,有點題即便5%難度係數,解決起來也並不容易,須要不斷找bug或優化算法的性能,當在projecteuler.net上輸入答案獲得正確反饋的一刻,有一種成功的喜悅。
而後就想會把前50題,前70題所有攻克!
而後就會忘了學Rust的初心,忘了作歐拉題的初心,我是想學MOVE編程語言,我是想學區塊鏈的智能合約編程技術,因此就放慢了刷題的節奏。
寫完這63道題的小結,也是將前面學習Rust的過程進行一次小結。後面可能會更新這本PDF書,也可能不會。
二、數學題並非所有
歐拉計劃以數學題爲主,對數學或算法感興趣的朋友,能夠拿它練習,若是你學習JAVA、C#、Python等編程語言,拿它練練手,絕對挺有用。
但它的侷限性也是顯然的,實際的軟件項目中幾乎很難遇到素數判斷、質因子、大整數以及全排列生成的這些算法。你更要學習模塊的劃分、單元測試的編寫、程序的調試的基本技巧,字符串操做、數組排序、字典、哈希表的運用可能更加頻繁。
三、函數式編程
現代的編程語言都結合了過程式編程和函數式編程的優勢,經過這些例子的練習,你既能夠知道一般的過程式算法的寫法,也要理解函數式編程的優美和簡潔,但在實際項目中又不能爲了函數式編程減小几行代碼而去刻意地炫技,讓程序失去了可維護性。
須要在過程式編程和函數式編程之間達到一種平衡。
四、還得結合其它編程書籍
程序完成了,獲得了正確的答案,事情並無結束,Rust背後的一些原理,仍須要深刻地理解,字符串和切片的區別,iter()的背後機制,若是定義宏,全部權的借用關係,這些都尚未掌握。
內容太多,我直接把它寫成了一本電子書,下載地址:
連接: https://pan.baidu.com/s/1Py8rp4pqAQ5EU7vz6uLYxQ
提取碼: 58zw