Мне пришлось разработать метод заполнения нескольких наборов стоек определенной фиксированной высоты отдельными блоками, называемыми MCC. Каждый блок, который помещался в стойку, был разного размера, поэтому цель заключалась в том, чтобы использовать как можно меньше стоек и оптимально заполнить стойки с учетом высоты каждой единицы — использовалась рекурсивная функция для расчета оптимального способа заполнения стоек при использовании как можно меньшего количества стоек. возможное. Это метод вычисления «проблемы суммы подмножества». Я приложу весь проект, который рисует блоки, но основная функция — это то, что меня интересовало. Далее следует рекурсивная функция и метод ее вызова.

Public fR As Boolean Function RealEqual (A, B, Optional Epsilon As Double = 0,00000001)

RealEqual = Abs (A — B) ⇐ Epsilon End Function Функция ExtendRslt (CurrRslt, NewVal, Separator)

Если CurrRslt = «» Тогда ExtendRslt = NewVal _ Else ExtendRslt = CurrRslt & Separator & NewVal End Function Субрекурсивное соответствие (ByVal MaxSoln как целое число, ByVal TargetVal, InArr (), _ ByVal HaveRandomNegatives как логическое целое, _ ByVal Curr , ByVal Epsilon As Double, _ ByRef Rslt (), ByVal CurrRslt As String, ByVal Separator As String)

Dim I As Integer For I = CurrIdx To UBound (InArr, 2)

Если RealEqual (CurrTotal + InArr (2, I), TargetVal, Epsilon), то Rslt (UBound (Rslt)) = (CurrTotal + InArr (2, I)) _ & Separator & ExtendRslt (CurrRslt, I, Separator)

fR = True Если MaxSoln = 0 Тогда Если UBound (Rslt) Mod 100 = 0 Тогда Debug.Print «Rslt (» & UBound (Rslt) & «) =» & Rslt (UBound (Rslt))

Else ‘If UBound (Rslt)> = MaxSoln Then Exit Sub If fR = True Then Exit Sub End If ReDim Preserve Rslt (UBound (Rslt) + 1)

ElseIf IIf (HaveRandomNegatives, False, CurrTotal + InArr (2, I)> TargetVal + Epsilon) Then ElseIf CurrIdx <UBound (InArr, 2) Then recursiveMatch MaxSoln, TargetVal, InArr (), HaveRandomNegatives, _ InArr (2, I), Epsilon, Rslt (), _ ExtendRslt (CurrRslt, I, Separator), _ Separator If MaxSoln <> 0 Then If fR = True Then Exit Sub Else ‘нет совпадений End If Next I End Sub Вызывается recursiveMatch MaxSoln, TargetVal, InArr, HaveRandomNegatives, _ LBound (InArr), 0, 0,00000001, _ Rslt, «», «,»