Никто не знает, как с помощью рекурсии решить, например, такое выражение: (2+4)/3 ???
Помню где было, но, как всегда, не помню где.
Очень надо, помогите
Function Eval(ByVal Expression As String) As Double
'Expression = "( ( 2 + 4 ) / ( 3 + 8 ) ) * ( 4 + 5 )"
Expression = Replace(Expression, " ", vbNullString)
Expression = Replace(Expression, ",", ".")
'Op1 и Op2 - операнды (Double)
'Op - операция (умножение, деление, сложение, вычитание и т.п.)
While Len(Expression) > 0
If InStr(Expression, "(") > 0 Then
'P1 - позиция открывающейся скобки, _(_(2+4)/(3+8))
'P2 - позиция закрывающейся скобки, ((2+4)/(3+8)_)_
res = Eval(Mid$(Expression, P1+1, P2-P1-1)
Expression = Mid$(Expression, 1, P1-1) & Trim$(Str$(res)) & Mid$(Expression, P2+1)
Else
'P0 - позиция оператор с наивысшим приоритетом, 2+4_/_11
'P1 - позиция первого операнда, 2+_4_/11
'P2 - позиция второго операнда, 2+4/_11_
'L0, L1, L2 - соответственно, длина оператора или операнда
'Если в выражении нет операндов, то P0 = 0
If P0 = 0 Then
Op1 = Val(Expression)
Expression = vbNullString
Else
Op = Mid$(Expression, P0, L0)
Op1 = Val(Mid$(Expression, P1, L1)
Op2 = Val(Mid$(Expression, P2, L2)
res = Eval(Mid$(Expression, P1, P2+L2-1)
Expression = Mid$(Expression, 1, P1-1) & Mid$(Expression, P2+L2)
End If
End If
WEnd
Select Case Op
Case vbNullString
Eval = Op1
Case "*"
Eval = Op1 * Op2
Case "+"
Eval = Op1 + Op2
...
End Select
End Function
Private Sub Command1_Click()
MsgBox Rec(1)
End Sub
Function Rec(i As Integer) As Integer
If i > 10 Then Exit Function
i = i + 1
Rec = Rec(i)
End Function
Function Rec(ByVal I As Integer) As Integer
If I > 10 Then
Rec = 10
Exit Funtion
End If
Rec = Rec(I+1)
End Function
'Intermediate
?Rec(11)
Sirik писал(а):За идею спасибо.
Но, я написал только пример. На самом деле всё гараздо сложнее.
Вот ещё один пример: ( ( 2 + 4 ) / ( 3 + 8 ) ) * ( 4 + 5 )
Заранее ни числа, ни само выражение не известы.
Я где видел контрол, который это всё делает, вот только не могу найти.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5