Умножая много чисел, но останавливаясь на нуле

Предположим, что есть функция prod(x), которая возвращает произведение последовательности чисел x.

Если число операндов в x может быть сколь угодно большим, как можно подумать об уменьшении времени для вычисления произведения x путем прекращения умножения при обнаружении нуля? Это то, что зрелые компиляторы и интерпретаторы уже делают?

Если кто-то пишет свою собственную функцию prod(x), каков наилучший подход? Имеет ли смысл когда-нибудь делать что-то вроде if 0 in x then return(0) else multiply(x)?

Например, если x = 1,0,3,4,...,-4,9Не нужно продолжать умножать после второго семестра, верно?

3 ответа

Решение

В целом: оптимизация компилятора в основном выполняется на основе данного исходного кода. Вы говорите об оптимизации данных во время выполнения, что компиляторы (обычно) не будут делать. Это означает, что вы должны написать эти оптимизации самостоятельно.

В этом случае: вы действительно можете остановиться, когда есть 0,

Любое умножение с 0 возвращает 0, так что вы бы проверили, есть ли 0 в последовательности, и просто вернете 0.

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

Другие вопросы по тегам