Выполнить сегмент кода, только если цикл достигает своего последнего цикла (конец цикла) - PullRequest
1 голос
/ 30 октября 2009

Где наиболее эффективная позиция для кодового блока, который должен выполняться, только если цикл достиг своего конца, без предварительного прерывания (через разрыв или возврат)?

Вопрос кажется банальным, ответ очевиден, но я не уверен!

Ответ от специалистов по теории эффективности / эффективности очень приветствуется!


  1. Предоставлено : «Некоторый код X» всегда одинаков, только в разных позициях сегмента кода 1 и 2.

  2. Я полагаю, : 2 будет выполняться с той же надежностью, что и 1. Я ошибаюсь?

  3. Я знаю: 2, очевидно, более эффективен, так как он вызывается только один раз после того, как цикл выполнил $ limit times, по сравнению с 1, чье включающее условие if называется $ limit times, и если однажды истина, сам код вызывается. Таким образом, разница эффективности равна , если условие запрашивается в $ предельных временах .

Отсюда я делаю вывод: предпочесть использование сегмента кода 2, а не сегмента кода 1, если мое предположение неверно!


for ($i = 0; $i <= $limit; $i++) {
    // Some Code A [...]
    // Executed every iteration.

    // If condition is met, abort the loop and return $result
    if (condition) {
        return $result;
    }

    // Code Segment 1, only executed in last iteration if no abortion happened previously. If-condition checked $limit times!
    if ($i == $limit) {
        // Some Code X [...]
        return $result
    }
}
// Code Segment 2, only executed if no abortion happened. At most executed only once!
// Some Code X [...]
return $result

Ответы [ 3 ]

1 голос
/ 30 октября 2009

Как то так?:

$aborted = false;
for ($i = 0; $i <= $limit; $i++) {
    // Code
    if ($condition) {
        // Code
        $aborted = true;
        break;
    } else {
        // Code
    }
}

if ($aborted) {
    // Code
} else {
    // Code
}

return $result;

Если вы проходите через массив (или другую итеративную структуру), используйте цикл foreach и вставьте после него код «завершенного цикла».

1 голос
/ 30 октября 2009

Вы сделали правильный вывод ... сегмент 2 гораздо эффективнее, чем сегмент 1 .. по причинам, которые вы уже указали.

I условия сложности, в случае цикла u для U есть O (n) (где n = $ limit) и в случае сегмента 2 это константа O (1) .. так что да, сегмент 2 - это путь к идти.

0 голосов
/ 30 октября 2009

если вы используете return при остановке цикла, то второй блок после цикла всегда будет выполняться, так как return останавливает всю функцию.

если вы используете перерыв. что-то вроде оператора if ($ i == $ limit) у вас в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...