【发布时间】: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