Мемонирование эффективно относится к запоминанию («воспоминания» → «меморандум» → для запоминания) результаты вызовов методов на основе входных данных метода, а затем возврат запоминаемого результата, а не повторение вычисления результата. Вы можете думать об этом как кэш для результатов метода. Более подробную информацию см. На стр. 387 для определения в . Введение в алгоритмы (3e), Cormen и др.
. Простой пример вычисления факториалов с использованием memoization в Python был бы чем-то вроде это:
factorial_memo = {}
def factorial(k):
if k < 2: return 1
if k not in factorial_memo:
factorial_memo[k] = k * factorial(k-1)
return factorial_memo[k]
Вы можете усложниться и инкапсулировать процесс memoization в класс:
class Memoize:
def __init__(self, f):
self.f = f
self.memo = {}
def __call__(self, *args):
if not args in self.memo:
self.memo[args] = self.f(*args)
#Warning: You may wish to do a deepcopy here if returning objects
return self.memo[args]
Затем:
def factorial(k):
if k < 2: return 1
return k * factorial(k - 1)
factorial = Memoize(factorial)
Функция известный как « decorators », был добавлен в Python 2.4, который позволяет вам просто написать следующее, чтобы выполнить одно и то же:
@Memoize
def factorial(k):
if k < 2: return 1
return k * factorial(k - 1)
Библиотека декораторов питона имеет аналогичный декоратор, называемый memoized
, который немного более устойчив, чем класс Memoize
, показанный здесь.
Вам нужно как-то определить выпадающий список для обновления. $('.certificate-list')
возвращает все выпадающие списки сертификатов на странице. Вы можете использовать id обязательной подписи для этой цели.
- @mandatory_signatures.each do |mandatory_signature|
.form-group.row.mt-4
.col-sm-5
%label Choose #{mandatory_signature.signature_title}
.centered-vertical
= select_tag '', options_from_collection_for_select(find_users_with_certificate_for(mandatory_signature), :id, :full_name), { include_blank: "Select User", class: 'form-control select2 find-user-certificate', style: 'width: 100%;', data: { mandatory: mandatory_signature.id } }
.col-sm-5
%label Choose Certificate
.centered-vertical
= select_tag nil, "", { include_blank: "Select Certificate", class: "form-control select2 certificate-list js-#{ mandatory_signature.id }", style: 'width: 100%;' }
$('.find-user-certificate').change(function() {
let user_id = $(this).val();
let mandatory_id = $(this).data('mandatory')
getUserCertificates(user_id, mandatory_id);
});
function getUserCertificates(userId, mandatoryId) {
let hostname = window.location.origin;
$.ajax({
url: hostname + '/users/' + userId + '/certificates',
dataType: 'json',
method: 'get',
success: function(data) {
options = '';
data.forEach(function(object) {
options += `<option value=${object.id}>${object.name}</option>`;
});
$('.certificate-list.js-' + mandatoryId).empty();
$('.certificate-list.js-' + mandatoryId).append(options);
}
});
}