Это вызов функции только дважды хорошо использовать рекурсию?


Это, технически, рекурсивная функция? Это только вызывается один раз сам по себе, но он почистил мой код немного, я думаю. Или, это излишне усложнит код?

sub check_backlog {
    my $topic        = shift;
    my $prev_backlog = shift;
    my $backlog      = undef;
    my @status = `$CMD -topicstat $topic`;
    foreach (@status) {
        if (/Message count: (\d+)/) {
            $backlog = $LAST_PAREN_MATCH;
            if ( !$prev_backlog && $backlog > 1 ) {
                sleep $topic_wait_time;
                check_backlog( $topic, $backlog );
            }
            elsif ( $backlog > $prev_backlog ) {
                check_over_thresholds($backlog);
            }
        }
    }
    return $backlog;
}


404
4
задан 2 марта 2011 в 06:03 Источник Поделиться
Комментарии
2 ответа

Да, каждая функция, которая называет себя считается рекурсивной функции.

Рекурсия-это очень полезно при обходе деревьев и тому подобное.

Как я не полностью понимаю в Perl, я не могу действительно сказать, является ли этот случай правильного использования рекурсии, может быть, также обеспечивают цель вашего кода.

Обновление

Если вы просто хотите, чтобы увидеть, является ли данные прохождения (или не прохождения) через очередь, я не найду рекурсии для соответствующей реализации.

Я ожидаю, что функция, которая возвращает либо истинным или ложным через заданный промежуток времени, или сразу, когда информация проходит через.

Рассмотрим следующие псевдо-код:

function isDataPassing( queue, time )
{
headOfQueue = queue.peek();
dataPassing = false;
while ( timePassed < time )
{
if ( headOfQueue != queue.peek() )
{
dataPassing = true;
break;
}
}

return dataPassing;
}

Я не могу помочь вам, как бы вы идти о реализации этого в Perl. Сайте StackOverflow-это лучшее место, чтобы задать такой вопрос.

3
ответ дан 2 марта 2011 в 06:03 Источник Поделиться

Я не знаю достаточно на Perl, но это выглядит подозрительно. С одной стороны, вы возвращаете значение из check_backlog с:

return $backlog;

Но при вызове check_backlog вы не используете возвращаемое значение на всех!

check_backlog( $topic, $backlog );

Единственным результатом рекурсивного вызова является то, что он может спать какое-то время, но это не влияет на возвращаемое значение.

Но, повторюсь, я знаю только немного Perl, поэтому я могу ошибаться.

1
ответ дан 2 марта 2011 в 06:03 Источник Поделиться