F#入門學習(七)

  1. mutable可變值關鍵字
    F#這個語言與其他入門語言有個很大的不同,那就是,定義的值是不可變的。
    也就是說,默認情況下,系統自動認爲值是不可變的。
    在這裏插入圖片描述
    這樣的兩行代碼在C語言可行,在F#中卻說x的定義重複。
    不可變值有很多優點:
  • 內在的線程安全
  • 在推理和理解方面較簡單
  • 有較高的安全性
    但是如果必須用到可變的值呢?
    就可以使用mutable關鍵字了。
    let mutable x = 5
    x
    x <- 10
    x
    
    //val mutable x : int = 5代表x可變
    //val it : int = 5現在x值爲5
    //val mutable x : int = 10現在x這個可變關鍵字被賦值爲10
    //val it : int = 10現在x值爲10
    <- 這個運算符的功能是將值賦值給已定義標識符
    mutable 與 <- 要一起出現
  1. if條件表達式(if … then …else…)
    then和else返回值必須相同

    let x = 56
    let msg = 
        if x = 56 then "是56"
        else "不是56"
    

    //val x : int = 56
    //val msg : string = “是56”
    這是最普通的一種表達

    let test x y = 
        if x = y then  "等於"
        elif x<y then "小於"
        else "大於"
    printfn "%d %s %d."10 (test 10 20) 20
    //這裏的(test 10 20)必須加括號,代表是string類型,要不然會報錯。
    

    //10 小於 20.
    //val test : x:'a -> y:'a -> string when 'a : comparison
    //val it : unit = ()
    這些都是完整的if語句,那要是語句不完整,會出現什麼情況?
    在這裏插入圖片描述
    缺少else是要報錯的,原因是if是一個表達式,而非語句,(這句話我讀了好幾遍還是雲裏霧裏,但是我知道)後面可以跟(printf語句,或者<- 運算符),就是unit類型,就不會報錯。

    let x1 = 1
    if 10 > 20 then printfn"哇哦"
    

    //val x1 : int = 1
    //val it : unit = () unit是if語句默認的類型

    let x1 = 1
    if 30 > 20 then printfn"哇哦"
    

    //哇哦 ( print語句也是unit類型,所以可以運行嗎,不會報錯。)
    //val x1 : int = 1
    //val it : unit = ()

  2. 遞歸
    這裏遞歸必須要用關鍵字rec。遞歸由兩部分組成:1.遞歸出口2.遞歸體。
    以下是求階乘的例子:

    let rec fact x = 
        if x = 1 then 1 
        else x * fact(x-1)
    let y = fact 5
    

    //val fact : x:int -> int
    //val y : int = 120
    以下是求和公式:

    let rec sum  x =
        if x = 0 then 0
        else sum(x-1) + x
    let y = sum 100
    

    //val sum : x:int -> int
    //val y : int = 5050

  3. 循環表達式(for…to…do…)
    for循環最後返回值必須是unit類型
    以下是1到10求和:

    let mutable s = 0
    for i = 1 to 10 do
        s <- s + i     //<-和mutable對應
        printf"%d "i
    printfn"s = %d"s
    

    //1 2 3 4 5 6 7 8 9 10 s = 55
    //val mutable s : int = 55
    //val it : unit = ()
    以下是打印10到1:

    let fun1 = 			//將for循環封裝成一個函數
        for i = 10 downto 1 do
            printf"%d "i
        printfn""
    fun1			//調用
    

    //10 9 8 7 6 5 4 3 2 1
    //val fun1 : unit = ()
    //val it : unit = ()
    以下是使用函數表示起始值和終值:

    let beginning x y = x - 2 * y
    let ending x y = x + 2 * y
    let function3 x y =
        for i = (beginning x y ) to (ending x y) do  	//加括號
            printf"%d "i
        printfn""
    function3 10 4
    

    //2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    //val beginning : x:int -> y:int -> int
    //val ending : x:int -> y:int -> int
    //val function3 : x:int -> y:int -> unit
    //val it : unit = ()

  4. while…do循環表達式(while…do…)
    以下是構造1到10的循環:

    let fun1 = 
        let mutable i = 1
        while i <= 10 do
            printf"%d "i 
            i <- i + 1
        printfn""
    fun1 
    

    //1 2 3 4 5 6 7 8 9 10
    //val fun1 : unit = ()
    //val it : unit = ()

  5. 生成隨機數,使用while循環生成隨機數,直到這個這個隨機數等於我們固定好的數

    open System
    let lookForValue value maxValue = 			//想找value,隨機數最大能到maxValue
        let mutable contimueLooping = true 		//控制循環條件
        let randomNumbleGenerator = new Random()    //生成一個實例,以後用這個實例幹活
        while contimueLooping do 					//while循環,生成1到maxValue之間的隨機數
            let rand = randomNumbleGenerator.Next(maxValue)  //這個函數看下圖,生成一個非負且不大於maxValue的整數
            printf"%d "rand			//打印每個隨機數
            if rand = value then 		//如果找到
                printfn"\n找到數據 %d " value   //就打印找到
                contimueLooping <- false		//並且停止循環
    lookForValue 12 29   	//1到29生成隨機數,找12
    

    //17 28 5 15 17 17 2 9 23 7 20 1 10 1 7 7 4 0 2 28 14 9 16 23 1 14 23 6 10 24 17 25 22 28 6 0 8 1 5 17 0 27 0 19 21 21 25 28 12
    //找到數據 12
    //val lookForValue : value:int -> maxValue:int -> unit
    //val it : unit = ()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章