【问题标题】:What is the immutable version to de/reference array?de/reference 数组的不可变版本是什么?
【发布时间】:2013-04-15 03:44:19
【问题描述】:

如何取消/引用这段代码中的 3 个数组变量而不是使用可变值?

以下代码通过对角线遍历 m*n 数组来计算最长公共子序列 (LCS)。

参数是 2 个字符数组,如下所示:

所以 LCS 方法的结果应该是长度 4,因为最长的公共子序列字符是“acbb”和“bcbb”。

let private s1 = "ABCDBB".ToCharArray()    
let private s2 = "CBACBAABA".ToCharArray()
    let public lcs_seq_1d_diags (x:char[]) (y:char[]) = 
        let m = x.Length
        let n = y.Length

        let mutable dk2 = Array.create (1+m) 0
        //printfn "\r\n0: %A" dk2
        let mutable dk1 = Array.create (1+m) 0
        //printfn "1: %A" dk1
        let mutable dk = Array.create (1+m) 0

        for k = 2 to m+n do
            let low = max 1 (k-m)
            let high = min (k-1) n

            for j = low to high do
                let i = k - j
                if x.[i-1] = y.[j-1] then
                    dk.[i] <- dk2.[i-1] + 1
                else 
                    dk.[i] <- max dk1.[i] dk1.[i-1]

            let mutable temp = dk2
            dk2 <- dk1
            dk1 <- dk
            dk <- temp

        dk1.[m]

let private res_seq_1d_rows = duration (fun () -> lcs_seq_1d_rows s1 s2)
//res_seq_1d_rows = 4

【问题讨论】:

  • 可变性由数据类型决定——如果你想使用 System.Array 那么你需要期待/处理可变性。

标签: arrays reference f# mutable dereference


【解决方案1】:

看看参考单元格http://msdn.microsoft.com/en-us/library/dd233186.aspx

语法如下:

let a = ref 1 // declaring a reference
a := 2 // changing the reference value
printfn "%i" !a // dereferencing

这可能也很有趣:F#: let mutable vs. ref

【讨论】:

    【解决方案2】:

    默认情况下,数组是可变的。如果您想要不变性,请尝试使用列表。

    尝试从这个开始:

    let s1 = List.ofSeq "ABCDBB"
    let s2 = List.ofSeq "CBACBAABA"
    

    剩下的我留给读者作为练习:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      相关资源
      最近更新 更多