Насколько я знаю, Perl не оптимизирует рекурсивные вызовы хвоста, но можно фальсифицировать его.
sub f{
my($l,$r) = @_;
if( $l >= $r ){
return $l;
} else {
# return f( $l+1, $r );
@_ = ( $l+1, $r );
goto &f;
}
}
, Когда сначала названный им выделит место на стеке. Тогда это изменит свои аргументы и перезапустит подпрограмму, не добавляя ничего больше к стеку. Это поэтому притворится, что никогда не называло сам, изменяя его в итеративный процесс.
Примечание, что нет никакой" my @_;
" или" local @_;
", если Вы, это больше не будет работать.
При индексировании есть возможность сохранять векторы частотности терминов.
Во время выполнения найдите векторы частотности терминов для обоих документов с помощью IndexReader.getTermFreqVector () и найдите данные частоты документов для каждого термина с помощью IndexReader.docFreq (). Это даст вам все компоненты, необходимые для вычисления косинусного сходства между двумя документами.
Более простой способ - отправить документ A в виде запроса (добавив все слова в запрос как термины ИЛИ, увеличивая частоту каждого термина) и найдите в наборе результатов документ B.