for nums in 3 2 1 3 2 1 3 3 0 3 0 3 1 2 9 findmaxiterativenums maxnums true true true true findmaxiterative2 4 9 7 19 94 5 94 findmaxiterative traceback most recent call last valueerror findmaxiterative arg is an empty sequence divide and conquer algorithm find max value in list param nums contains elements param left index of first element param right index of last element return max in nums for nums in 3 2 1 3 2 1 3 3 0 3 0 3 1 2 9 findmaxrecursivenums 0 lennums 1 maxnums true true true true nums 1 3 5 7 9 2 4 6 8 10 findmaxrecursivenums 0 lennums 1 maxnums true findmaxrecursive 0 0 traceback most recent call last valueerror findmaxrecursive arg is an empty sequence findmaxrecursivenums 0 lennums maxnums traceback most recent call last indexerror list index out of range findmaxrecursivenums lennums 1 maxnums true findmaxrecursivenums lennums 1 1 maxnums traceback most recent call last indexerror list index out of range for nums in 3 2 1 3 2 1 3 3 0 3 0 3 1 2 9 find_max_iterative nums max nums true true true true find_max_iterative 2 4 9 7 19 94 5 94 find_max_iterative traceback most recent call last valueerror find_max_iterative arg is an empty sequence divide and conquer algorithm find max value in list param nums contains elements param left index of first element param right index of last element return max in nums for nums in 3 2 1 3 2 1 3 3 0 3 0 3 1 2 9 find_max_recursive nums 0 len nums 1 max nums true true true true nums 1 3 5 7 9 2 4 6 8 10 find_max_recursive nums 0 len nums 1 max nums true find_max_recursive 0 0 traceback most recent call last valueerror find_max_recursive arg is an empty sequence find_max_recursive nums 0 len nums max nums traceback most recent call last indexerror list index out of range find_max_recursive nums len nums 1 max nums true find_max_recursive nums len nums 1 1 max nums traceback most recent call last indexerror list index out of range the middle find max in range left mid find max in range mid 1 right
from __future__ import annotations


def find_max_iterative(nums: list[int | float]) -> int | float:
    
    if len(nums) == 0:
        raise ValueError("find_max_iterative() arg is an empty sequence")
    max_num = nums[0]
    for x in nums:
        if x > max_num:
            max_num = x
    return max_num



def find_max_recursive(nums: list[int | float], left: int, right: int) -> int | float:
    
    if len(nums) == 0:
        raise ValueError("find_max_recursive() arg is an empty sequence")
    if (
        left >= len(nums)
        or left < -len(nums)
        or right >= len(nums)
        or right < -len(nums)
    ):
        raise IndexError("list index out of range")
    if left == right:
        return nums[left]
    mid = (left + right) >> 1  
    left_max = find_max_recursive(nums, left, mid)  
    right_max = find_max_recursive(
        nums, mid + 1, right
    )  

    return left_max if left_max >= right_max else right_max


if __name__ == "__main__":
    import doctest

    doctest.testmod(verbose=True)