課程介紹
名稱: Functional Programming Principles in Scala
平臺: Coursera
難易度:中級
授課教師:Martin Odersky (Scala的作者)
評價
能聽到Scala作者的視頻課程尿招,還是很驚喜的李命。課程相對來說,趣味性不強盟蚣,但是很長知識悦屏。
比如节沦,Scala程序中不推薦使用return語句,如果你在程序中遇到?jīng)]有使用return础爬,按經(jīng)驗推理程序應該正常返回散劫,但是沒有,那么就有可能是你的分支沒有寫完整幕帆,Scala編譯器沒有推理出來你的隱式return获搏。
課堂筆記
week1 筆記
我們知道求浮點數(shù)是否相等要判斷兩個數(shù)的差值小于某一個閾值即可。那么比如求用牛頓法解平方的時候,遇到特別大的數(shù)或小數(shù)常熙,就需要稍微改進下這種方法了纬乍,我們只需要判斷兩個數(shù)的差值,與被開方的數(shù)比值小于某一閾值即可裸卫。
week1 作業(yè)
Write a recursive function that counts how many different ways you can make change for an amount, given a list of coin denominations. For example, there are 3 ways to give change for 4 if you have coins with denomination 1 and 2: 1+1+1+1, 1+1+2, 2+2.
編寫一個遞歸程序計算出仿贬,不同面額的硬幣加和等于某一整數(shù)的組合數(shù)。例如:整數(shù)是4墓贿,不同中的面額是【1茧泪,2】,那么它的組合數(shù)就是3種: 1+1+1+1, 1+1+2, 2+2聋袋。
思路:剛開始一直使用的是順序思維解題的队伟,比如先計算出單一的組合,然后是兩兩的組合幽勒,然后是三三的組合嗜侮,以此類推,但按照這種思想寫代碼感覺很復雜啥容。無奈锈颗,上網(wǎng)搜索一番,還真看到答案了咪惠,看了一下击吱,原來很簡單,只不過是缺乏經(jīng)驗或數(shù)學思維想不到遥昧。其實這就是算法中的分而治之算法覆醇,將一個復雜的問題分解成兩個或更多的相同或相似的子問題,直到最后子問題可以簡單的直接求解渠鸽,愿問題的解即子問題的解的合并叫乌。
那么此問題的解法就是分出兩個分支柴罐,一個分支求減少硬幣種類的組合數(shù)(比如:當前硬幣種類是[1, 2, 3], 那么接下來求[2, 3]徽缚,依次類推,直到硬幣種類不可以在減少為止革屠。)凿试;另一個分支求當前硬幣種類的組合數(shù)。最后兩分支加和即最終的組合數(shù)似芝。終止條件是那婉,子遞歸中當整數(shù)(amount)為0時,即為1種党瓮,返回1详炬,當整數(shù)為負或者硬幣種類為空的時候,此組合失敗寞奸,返回0呛谜。
圖:硬幣種類:【1在跳, 2, 3】隐岛,整數(shù)(amount):6
代碼:https://gist.github.com/tongtie/9c72f261aa139fc09b58c6ca24db6a50