Excel VBA中的递归代码

Excel VBA中的递归代码,excel,recursion,vba,Excel,Recursion,Vba,我试图运行这段代码来计算附加图片中等式16.4中不同Tn下的Q(n),但它没有给我正确的输出。我将感谢任何帮助。注:delta1=delta2=…deltan=dt=1(我在这里已采用),并将S项进一步除以10000,因为在方程中,S项位于基点,即1%的第100部分 Function Bootstrap(S As Range, Z As Range, L As Double) As Double Dim j As Integer Dim a As Variant Dim b As Variant

我试图运行这段代码来计算附加图片中等式16.4中不同Tn下的Q(n),但它没有给我正确的输出。我将感谢任何帮助。注:delta1=delta2=…deltan=dt=1(我在这里已采用),并将S项进一步除以10000,因为在方程中,S项位于基点,即1%的第100部分

Function Bootstrap(S As Range, Z As Range, L As Double) As Double
Dim j As Integer
Dim a As Variant
Dim b As Variant
Dim n As Integer
Dim Q() As Double
Dim sum As Double
Dim P As Double
Dim dt As Double

n = Application.WorksheetFunction.Max(S.Columns.Count, Z.Columns.Count)
a = S.Value
b = Z.Value
dt = 1
sum = 0
ReDim Q(0 To n)
Q(0) = 1

For j = 1 To n - 1
    P = (b(1, j) * (L * Q(j - 1) - (L + dt * a(1, n) / 10000) * Q(j))) / (b(1, n) * (L + a(1, n) * dt / 10000)) + Q(n - 1) * L / (L + a(1, n) * dt / 10000)
    sum = sum + P
    Q(n) = sum
Next j

Bootstrap = sum
End Function

例如,要求解递归函数,可以这样编写

Function Factorial(n as long) as long
    If n = 1 Then
        Factorial = 1
    Else
        Factorial = n * Factorial(n-1)
    End If
End function
是的,您可以看到,
For…Loop
也可以进行阶乘计算,但在您的情况下,使用递归解决方案要容易得多

此外,等式16.4有意编写为递归函数。它不是作为求和函数编写的,因为这样做比较困难。如果给您的是求和函数,那么您可以应用
For…Loop
解决方案

希望这有帮助

编辑

Function Q(n as long) as double

    If n = 1 Then
        Q = 5
    Else
        Q = Z * ( L * Q_t - (L + d * S) * Q(n-1) ) / ( Z * ( L + d * S ) )
    End If

End Function
请注意,当
n>1
时,函数
Q
会在
Q(n-1)
中不断调用自身。这就是所谓的递归解决方案


(检查公式。我可能会复制错误)

你能比“它没有给我正确的输出”更具体一点吗?事实上,引导,即Q(n)应该始终在0和1之间,因为它是概率,但有时当我输入时,它甚至会>1,对于n=1,引导值Q(1)给出值错误。输入向量是507794125133,对应的Z矩阵是0.970.940.920.860.81,L=0.5。这就给出了Bootstrap=Q(n=1到5)值的输出,对应为#VALUE!1.016264422 1.034891859 1.113982199 1.166501913我知道你现在在做什么。。。尝试递归地解决这个问题。事实上,您的教科书已经为您提供了递归函数。因此,只需在VBA中直接使用它,无需将其解释为
For…循环
序列。我认为您必须在For循环中将
Q(n)=sum
更改为
Q(j)=sum
。请现在检查修改后的代码,但仍然存在问题。@Shenon。请您修改我的代码,这样我就可以准确地得到您所说的无需for循环的递归。老实说,我对函数Q()不是很确定。但是我看到了
Q(t,tj)
Q(t,t_j-1)
,文本要求为
Q(t,t_j)
求解。这建议使用递归解决方案。“看我的阶乘例子,它非常直截了当。你的意思是Q(n)=Q(n-1)*j项(通过放置n)+Q(1)?你可以把Q(t,tj)简单地写成Q(j)。没问题。是的
Q(n)
Q(n-1)
Factorial很简单..但这似乎有点复杂。。我正在尝试,但没有得到正确的输出..如果您在得到确切的Q()后现在可以修改它。