3.3.4.2用 f# 求列表中數字的和
我們已經知道了用 c# 實現的**,現在,再嘗試用 f# 實現同樣的功能。清單 3.16 是f# 函式 sumlist,並用幾個f# interactive 命令進行了測試。
清單 3.16對列表中元素求和(f# interactive)
> let rec sumlist list =
match list with <- 根據模式,匹配列表
| -> 0 [1]
|head::tail -> head + sumlist(tail) [2]
val sumlist : int list -> int [3]
> let list = [ 1 .. 5 ];; <- 建立測試列表
val list : int list
> sumlist(list);; <- 計算,輸出和
val it : int = 15
如果和前面用 c# 實現的**相比,會發現有很多相似之處。與前面的情況一樣,有兩個分支,乙個用於為空列表[1],乙個用於 cons cell [2],第二個分支也使用遞迴實現。顯著的區別在於,f# 可以使用模式匹配選擇執行路徑。模式匹配還能從 cons cell 中提取值,因此,執行一旦進入第二個分支, head 和 tail 的值就有了。因此,不會使用到沒有被模式匹配的值,能增加了**的穩健性。這聽起來微不足道,但能防止**意外地試圖訪問(不存在)空列表的元素。模式匹配是函式語言天生的結構,c# 中沒有對應的功能,所以,只能使用條件運算子(?:)來實現相同的行為。
另外,f# 型別推斷還有幫助:不必在**中顯式指定型別。可以看到,它正確推斷出函式取乙個整數列表,返回整數[3]。推理演算法測試 list 值是空列表,或cons cell,推斷出值的型別是列表。從乙個分支將返回 0,可知整個函式返回整數;因為,我們是把列表中的元素加到一起,可以推斷出引數是包含整數的列表。
這一節中的遞迴概念非常重要,但是,寫遞迴很難。在下一節,我們將介紹一種機制,能夠隱藏**中困難的遞迴部分。
[4] 我們可以在**中新增對 foreach 語句的支援,對於funclist 型別,這樣做是值得的。
Python中的數字型別和列表 前篇
1.int 整型 print int 2.34 2print int 1.999 1print int 2.4 2 浮點數轉換成整數的時候只是單純的儲存整數部分 print int 10 3j can t conver complex to int 複數不能轉換成int型別 print int tr...
關於輸出用 lf和 f的問題
問 有人告訴我不能在printf中使用 lf。為什麼printf 用 f輸出double型,而scanf卻用 lf呢?答 printf的 f說明符的確既可以輸出float型又可以輸出double型。根據 預設引數提公升 規則 在printf這樣的函式的可變引數列表中,不論作用域內有沒有原型,都適用這...
關於輸出用 lf和 f的問題
f 對應 float lf 對應 double lf 對應 long double e以科學計數法顯示 g在 e和 f中擇短顯示 int m float n scanf lf d n,m 輸入n 81,m 4 cout n 解決辦法 1 將 lf 改為 f 2 將float改為double c 果然...