Recursion code in VBA

天大地大妈咪最大 提交于 2020-01-07 08:28:14

问题


I am trying to run this code to calculate Q(n) at different Tn in the Equation 16.4 in the attached picture.But its not giving me the correct output. I would appreciate any help. Note: delta1=delta2 =...deltan = dt=1 ( I have taken here ) and further divided S term by 10000 just because in the Equation it is in basis point i.e. 100th part of 1 %.

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

回答1:


To solve a recursive function you can write it this way, for example

Function Factorial(n as long) as long
    If n = 1 Then
        Factorial = 1
    Else
        Factorial = n * Factorial(n-1)
    End If
End function

Yes, you can see For...Loop can also do the Factorial calculation, but in your case, its much easier to use recursive solution.

Besides Eq 16.4 is intentionally written as a recursive function. It is not written as a summation function because it is harder to do so. If given to you is a summation function, then you can apply the For...Loop solution.

Hope this helps.

EDIT

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

Notice that the function Q keep calling itself in Q(n-1) when n>1. That is called recursive solution.

(Check the formula. I might copy it wrong)



来源:https://stackoverflow.com/questions/33997744/recursion-code-in-vba

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!