Добрый день.
Решил добавить в приложение универа информацию о шансе поступления на специальность для абитуриентов.
В БД есть следующие данные по абитуриентам: приоритеты специальностей (1,2,3), тип документа (подлинник/копия).
Формулировка задачи: Допустим, что всего подали заявлений N человек по M специальностям. Абитуриент хочет узнать шанс поступления на 3 специальности. Пусть количество мест на одну специальность равно K.
Первый этап
Я планировал это сделать в виде
рекурсии.
На вход подается информация о первом абитуриенте в списке (топ-1). Если выбранная специальность - его первый приоритет или тип документа - копия, выходим из рекурсии. Если второй/третий, идем в эти специальности и начинаем алгоритм с начала.
Минус этого алгоритма в том, что на выходе получаем огромный список/дерево, в котором в лучшем случае мы обойдем только 3 из M специальностей и количество человек на каждой специальности будет 2*K. Но минус даже не в этом дереве, а в том, что может случиться переполнение стека, потому что в худшем случае это будет M специальностей и N человек.
Второй этап
После составления этого списка требуется определить шанс поступления.
Я придумал следующую формулу:
Шанс = 100 -(Количество мест в рейтинге * 0,6 - Текущее место в рейтинге) * (Количество мест в рейтинге / 100)
Здесь еще нужно учитывать тип документа с отрицательным весовым коэффициентом, но пока не придумал с каким.
Третий этап
После определения шанса требуется пересчитать шансы всех абитуриентов, заменив у всех, у кого шанс поступления ниже X процентов, специальности (с 1 на 2, с 2 на 3). Есть шанс больше X процентов, прекратить пересчет шанса текущего абитуриента.
Тут, я предполагаю, будет максимум 3 итерации.
Вопросы:
- Можно ли использовать более простое решение, нежели рекурсия?
- Корректна ли формула по расчету шанса на поступление?