← Назад к вопросам

Сумма элементов массива

2.0 Middle🔥 201 комментариев
#Теория тестирования

Условие

Напишите функцию, которая находит сумму всех элементов массива без использования встроенных функций sum.

Пример

Вход: [1, 2, 3, 4, 5] Выход: 15

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Понимание задачи

Нужно найти сумму всех элементов массива без использования встроенной функции sum(). Это базовая операция, но важная для тестирования и разработки.

Основное решение: Итерация с циклом

def array_sum(arr):
    """
    Находит сумму всех элементов массива без sum().
    """
    total = 0
    for num in arr:
        total += num
    return total

# Использование
result = array_sum([1, 2, 3, 4, 5])
print(result)  # 15

Как это работает

Пошаговое выполнение:

Шаг 0: total = 0
Шаг 1: total = 0 + 1 = 1
Шаг 2: total = 1 + 2 = 3
Шаг 3: total = 3 + 3 = 6
Шаг 4: total = 6 + 4 = 10
Шаг 5: total = 10 + 5 = 15
Результат: 15

Анализ сложности

Временная сложность: O(n)

  • n = количество элементов массива
  • Проходим массив один раз
  • Каждая итерация выполняет O(1) операцию

Пространственная сложность: O(1)

  • Используем только одну переменную total
  • Не зависит от размера входного массива

Расширенная реализация с типизацией

from typing import List, Union

def array_sum(arr: List[Union[int, float]]) -> Union[int, float]:
    """
    Находит сумму всех элементов массива.
    
    Args:
        arr: Массив целых или вещественных чисел
    
    Returns:
        Сумма всех элементов
    
    Raises:
        ValueError: Если массив содержит неподдерживаемые типы
    """
    if not isinstance(arr, (list, tuple)):
        raise TypeError("Вход должен быть списком или кортежем")
    
    total = 0
    for num in arr:
        if not isinstance(num, (int, float)):
            raise ValueError(f"Неподдерживаемый тип: {type(num)}")
        total += num
    
    return total

# Тестирование
print(array_sum([1, 2, 3, 4, 5]))  # 15
print(array_sum([1.5, 2.5, 3.0]))  # 7.0
print(array_sum([]))  # 0
print(array_sum([-1, -2, 3]))  # 0

Альтернативные подходы

Способ 1: Функциональный (reduce)

from functools import reduce

def array_sum_reduce(arr):
    return reduce(lambda a, b: a + b, arr, 0)
  • Более функциональный стиль
  • O(n) время, O(1) дополнительная память
  • Менее читаемо для новичков

Способ 2: Рекурсия

def array_sum_recursive(arr):
    if len(arr) == 0:
        return 0
    return arr[0] + array_sum_recursive(arr[1:])
  • Рекурсивное решение
  • O(n) время, O(n) память (стек вызовов)
  • Неэффективно для больших массивов

Способ 3: While цикл

def array_sum_while(arr):
    total = 0
    i = 0
    while i < len(arr):
        total += arr[i]
        i += 1
    return total
  • Старомодный стиль
  • O(n) время, O(1) память
  • Менее Pythonic, чем for цикл

Способ 4: Enumerate для отслеживания индекса

def array_sum_enumerate(arr):
    total = 0
    for index, value in enumerate(arr):
        total += value
    return total
  • Полезно, если нужен индекс
  • O(n) время, O(1) память

Расширенные варианты

С обработкой пустого массива

def array_sum_safe(arr):
    if not arr:
        return 0
    total = 0
    for num in arr:
        total += num
    return total

С фильтрацией (только положительные)

def array_sum_positive(arr):
    total = 0
    for num in arr:
        if num > 0:
            total += num
    return total

С отладкой (логирование)

def array_sum_debug(arr):
    total = 0
    for i, num in enumerate(arr):
        total += num
        print(f"Шаг {i}: добавлено {num}, итого = {total}")
    return total

Полное тестирование

import pytest

def test_array_sum():
    # Базовые случаи
    assert array_sum([1, 2, 3, 4, 5]) == 15
    assert array_sum([0]) == 0
    assert array_sum([]) == 0
    
    # Отрицательные числа
    assert array_sum([-1, -2, -3]) == -6
    assert array_sum([-5, 5]) == 0
    
    # Вещественные числа
    assert array_sum([1.5, 2.5]) == 4.0
    assert array_sum([0.1, 0.2, 0.7]) == pytest.approx(1.0)
    
    # Большие массивы
    assert array_sum(list(range(1, 101))) == 5050

Выводы

  • Базовое решение: for цикл — просто, читаемо, эффективно
  • O(n) время, O(1) память — оптимальная сложность
  • Граничные случаи: пустой массив, отрицательные числа, вещественные числа
  • Для QA: проверить поведение на edge cases, большие значения, переполнение
  • Лучшие практики: типизация, обработка ошибок, логирование