Умножая много чисел, но останавливаясь на нуле
Предположим, что есть функция 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.
Поскольку операция умножения коммутирует, вы можете оценивать слагаемые в любом порядке. Если бы у вас была отсортированная последовательность чисел, вы могли бы просто увидеть, равен ли первый элемент нулю.