{"record":{"id":"a1b22de5410070fc","repo":"TheAlgorithms/Python","slug":"find-min-recursive-arg-is-an-empty-sequence","errorCode":null,"errorMessage":"find_min_recursive() arg is an empty sequence","messagePattern":"find_min_recursive\\(\\) arg is an empty sequence","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"maths/find_min.py","lineNumber":65,"sourceCode":"    >>> find_min_recursive(nums, 0, len(nums) - 1) == min(nums)\n    True\n    >>> find_min_recursive([], 0, 0)\n    Traceback (most recent call last):\n        ...\n    ValueError: find_min_recursive() arg is an empty sequence\n    >>> find_min_recursive(nums, 0, len(nums)) == min(nums)\n    Traceback (most recent call last):\n        ...\n    IndexError: list index out of range\n    >>> find_min_recursive(nums, -len(nums), -1) == min(nums)\n    True\n    >>> find_min_recursive(nums, -len(nums) - 1, -1) == min(nums)\n    Traceback (most recent call last):\n        ...\n    IndexError: list index out of range\n    \"\"\"\n    if len(nums) == 0:\n        raise ValueError(\"find_min_recursive() arg is an empty sequence\")\n    if (\n        left >= len(nums)\n        or left < -len(nums)\n        or right >= len(nums)\n        or right < -len(nums)\n    ):\n        raise IndexError(\"list index out of range\")\n    if left == right:\n        return nums[left]\n    mid = (left + right) >> 1  # the middle\n    left_min = find_min_recursive(nums, left, mid)  # find min in range[left, mid]\n    right_min = find_min_recursive(\n        nums, mid + 1, right\n    )  # find min in range[mid + 1, right]\n\n    return left_min if left_min <= right_min else right_min\n\n","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/TheAlgorithms/Python/blob/f5988cc09713315817df6a7e327e258013a94440/maths/find_min.py#L47-L83","documentation":"Raised by find_min_recursive() in maths/find_min.py when nums is an empty list. The divide-and-conquer minimum recurses down to single-element subranges indexed by left/right; with zero elements there is no base case, so it raises ValueError before any index handling.","triggerScenarios":"Calling find_min_recursive([], left, right) with any bounds. The `if len(nums) == 0` check fires first; non-empty input with bad bounds instead raises IndexError (see error 559).","commonSituations":"Empty filtered datasets or empty batches reaching the recursive helper; pipelines that assume at least one record after grouping; tests probing edge cases.","solutions":["Guard for emptiness at the call site and choose a default or explicit error.","Check size where data is loaded or filtered, not deep in the aggregation loop.","Use find_min_iterative or built-in min if divide-and-conquer is not required — same empty-input contract, simpler bounds."],"exampleFix":"# before\nlo = find_min_recursive(values, 0, len(values) - 1)  # values == [] -> ValueError\n\n# after\nif values:\n    lo = find_min_recursive(values, 0, len(values) - 1)\nelse:\n    lo = None","handlingStrategy":"validation","validationCode":"if not nums:\n    raise ValueError('cannot compute min of empty dataset')\nlo = find_min_recursive(nums, 0, len(nums) - 1)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check emptiness before computing and passing bounds.","Use inclusive right bound len(nums) - 1 (see error 559).","Centralize empty-handling instead of guarding every recursive call."],"tags":["math","min","recursion","empty-sequence","valueerror"],"backgroundTag":null,"analyzedSha":"f5988cc09713315817df6a7e327e258013a94440","analyzedAt":"2026-08-14T17:30:07.041Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}