代码之家  ›  专栏  ›  技术社区  ›  John Kim

Vbscript-在递归函数中声明新变量

  •  0
  • John Kim  · 技术社区  · 5 年前

    我试图用VBScript实现Strassen的矩阵乘法算法。但是我有很多递归的问题。

    在以下递归算法中:

    Function multiply(matrixA, matrixB)
        Dim n
        n = UBound(matrixA) + 1
        ReDim R(n - 1, n - 1)
    
        If (n = 1) Then
            R(0,0) = matrixA(0,0) * matrixB(0,0)
        Else
            ReDim A11(n/2 - 1, n/2 - 1)
            ReDim A12(n/2 - 1, n/2 - 1)
            ReDim A21(n/2 - 1, n/2 - 1)
            ReDim A22(n/2 - 1, n/2 - 1)
            ReDim B11(n/2 - 1, n/2 - 1)
            ReDim B12(n/2 - 1, n/2 - 1)
            ReDim B21(n/2 - 1, n/2 - 1)
            ReDim B22(n/2 - 1, n/2 - 1)
    
            Call PartitionMatrix(matrixA, A11, 0, 0)
            Call PartitionMatrix(matrixA, A11, 0, n/2 - 1)
            Call PartitionMatrix(matrixA, A21, n/2 - 1, 0)
            Call PartitionMatrix(matrixA, A22, n/2 - 1, n/2 - 1)
            Call PartitionMatrix(matrixB, B11, 0, 0)
            Call PartitionMatrix(matrixB, B12, 0, n/2 - 1)
            Call PartitionMatrix(matrixB, B21, n/2 - 1, 0)
            Call PartitionMatrix(matrixB, B22, n/2 - 1, n/2 - 1)
    
            Dim M1, M2, M3, M4, M5, M6, M7
            M1 = multiply(AddMatrix(A11, A22), AddMatrix(B11, B22))
            M2 = multiply(AddMatrix(A21, A22), B11)
            M3 = multiply(A11, SubMatrix(B12, B22))
            M4 = multiply(A22, SubMatrix(B21, B11))
            M5 = multiply(AddMatrix(A11, A12), B22)
            M6 = multiply(SubMatrix(A21, A11), AddMatrix(B11, B12))
            M7 = multiply(SubMatrix(A12, A22), AddMatrix(B21, B22))
            Wscript.Echo UBound(R) 'Returns only 0's in console
    
            Dim C11, C12, C21, C22
            C11 = AddMatrix(SubMatrix(AddMatrix(M1, M4), M5), M7)
            C12 = AddMatrix(M3, M5)
            C21 = AddMatrix(M2, M4)
            C22 = AddMatrix(SubMatrix(AddMatrix(M1, M3), M2), M6)
    
            Call JoinMatrix(C11, R, 0 , 0)
            Call JoinMatrix(C12, R, 0 , n/2 - 1)
            Call JoinMatrix(C21, R, n/2 - 1, 0)
            Call JoinMatrix(C22, R, n/2 - 1, n/2 - 1)
        End If
        multiply = R
    End Function
    

    我正在指定 multiply 将函数转换为变量M1、M2等。然而,似乎 R 我要回来了 是从递归函数继承过来的-就像,它没有声明一个新的矩阵 UBound(R) 实际上每次在递归中调用函数时都会得到一个新的声明吗?

    0 回复  |  直到 5 年前
        1
  •  2
  •   AHeyne    5 年前

    R 它没有显式地标注在任何地方,因此它隐式地标注在函数之外,您只需在函数中重新标注它。

    插入 Dim R() 正上方 ReDim R(n - 1, n - 1) 在函数中显式地对它进行尺寸标注,它应该按您所期望的那样工作。