Find Largest Number
Learn how to find the largest number in a list in Python without using built-in max().
Find Largest Number
Problem
Given a list of numbers, find the largest one. Do not use Python's built-in max() function — the goal is to understand how it works internally.
Input: [3, 1, 9, 7, 5]
Output: 9
Input: [100, 200, 50, 300, 150]
Output: 300
Input: [-5, -1, -8, -3]
Output: -1
Input: [42]
Output: 42Logic
- Assume the first number is the largest
- Go through every other number in the list
- If the current number is bigger than the assumed largest — update the largest
- After checking all numbers — the assumed largest is the real largest
- Return it
Flow
Solution 1 — using a loop
Start with the first number as the largest. Loop through the rest and update whenever a bigger number is found.
def find_largest(numbers):
# handle empty list
if not numbers:
return None
# assume the first number is the largest
largest = numbers[0]
# check every other number starting from index 1
for number in numbers[1:]:
if number > largest:
largest = number # found a bigger one — update
return largest
print(find_largest([3, 1, 9, 7, 5])) # 9
print(find_largest([100, 200, 50, 300, 150])) # 300
print(find_largest([-5, -1, -8, -3])) # -1
print(find_largest([42])) # 42
print(find_largest([])) # NoneCode Execution — Solution 1
Trace through find_largest([3, 1, 9, 7, 5]):
| Step | number | number > largest? | largest |
|---|---|---|---|
| Start | — | — | 3 |
| 1st | 1 | 1 > 3 → No | 3 |
| 2nd | 9 | 9 > 3 → Yes | 9 |
| 3rd | 7 | 7 > 9 → No | 9 |
| 4th | 5 | 5 > 9 → No | 9 |
| Done | 9 |
Trace through find_largest([-5, -1, -8, -3]):
| Step | number | number > largest? | largest |
|---|---|---|---|
| Start | — | — | -5 |
| 1st | -1 | -1 > -5 → Yes | -1 |
| 2nd | -8 | -8 > -1 → No | -1 |
| 3rd | -3 | -3 > -1 → No | -1 |
| Done | -1 |
Starting largest at numbers[0] instead of 0 is important. If all numbers are negative like [-5, -1, -8], starting at 0 would wrongly return 0 since no number is greater than 0. Starting at the first element guarantees correctness for any list.
Solution 2 — using index tracking
Same logic but also track the index of the largest number — useful when you need to know where the largest is, not just what it is.
def find_largest(numbers):
if not numbers:
return None
largest_index = 0 # assume first element is largest
for i in range(1, len(numbers)):
if numbers[i] > numbers[largest_index]:
largest_index = i # update the index of the largest
return numbers[largest_index]
print(find_largest([3, 1, 9, 7, 5])) # 9
print(find_largest([100, 200, 50, 300, 150])) # 300
print(find_largest([-5, -1, -8, -3])) # -1Code Execution — Solution 2
Trace through find_largest([100, 200, 50, 300, 150]):
| Step | i | numbers[i] | numbers[largest_index] | Update index? | largest_index |
|---|---|---|---|---|---|
| Start | — | — | 100 | — | 0 |
| 1st | 1 | 200 | 100 | Yes | 1 |
| 2nd | 2 | 50 | 200 | No | 1 |
| 3rd | 3 | 300 | 200 | Yes | 3 |
| 4th | 4 | 150 | 300 | No | 3 |
| Done | 3 |
numbers[3] = 300 → return 300
Solution 3 — using recursion
Break the problem down — the largest of a list is the larger of the first element and the largest of the rest.
def find_largest(numbers):
if not numbers:
return None
# base case — one element, it is the largest
if len(numbers) == 1:
return numbers[0]
# recursive case
# find the largest of the rest of the list
largest_of_rest = find_largest(numbers[1:])
# compare first element with largest of the rest
if numbers[0] > largest_of_rest:
return numbers[0]
else:
return largest_of_rest
print(find_largest([3, 1, 9, 7, 5])) # 9
print(find_largest([100, 200, 50, 300, 150])) # 300
print(find_largest([-5, -1, -8, -3])) # -1
print(find_largest([42])) # 42Code Execution — Solution 3
Trace through find_largest([3, 1, 9, 7, 5]):
find_largest([3, 1, 9, 7, 5])
compare 3 with find_largest([1, 9, 7, 5])
compare 1 with find_largest([9, 7, 5])
compare 9 with find_largest([7, 5])
compare 7 with find_largest([5])
base case → return 5
7 > 5 → return 7
9 > 7 → return 9
1 > 9? No → return 9
3 > 9? No → return 9
return 9Each recursive call peels off the first element and finds the largest of the rest. The call stack builds up, then unwinds — each level comparing its first element with the largest found deeper in the list.
Solution 4 — using reduce()
Use functools.reduce() to compare pairs of numbers across the whole list.
from functools import reduce
def find_largest(numbers):
if not numbers:
return None
# reduce compares two numbers at a time
# keeps the larger one and compares it with the next
return reduce(lambda a, b: a if a > b else b, numbers)
print(find_largest([3, 1, 9, 7, 5])) # 9
print(find_largest([100, 200, 50, 300, 150])) # 300
print(find_largest([-5, -1, -8, -3])) # -1
print(find_largest([42])) # 42Code Execution — Solution 4
Trace through find_largest([3, 1, 9, 7, 5]):
reduce compares pairs left to right, keeping the winner each time:
| Step | a | b | a > b? | Keeps |
|---|---|---|---|---|
| 1st | 3 | 1 | Yes | 3 |
| 2nd | 3 | 9 | No | 9 |
| 3rd | 9 | 7 | Yes | 9 |
| 4th | 9 | 5 | Yes | 9 |
| Done | 9 |
Bonus — find largest and its index together
def find_largest_with_index(numbers):
if not numbers:
return None, None
largest = numbers[0]
largest_index = 0
for i, number in enumerate(numbers):
if number > largest:
largest = number
largest_index = i
return largest, largest_index
numbers = [3, 1, 9, 7, 5]
value, index = find_largest_with_index(numbers)
print(f"Largest: {value} at index {index}")
# Largest: 9 at index 2Which solution to use?
| Solution | How | Best when |
|---|---|---|
| Solution 1 | Loop + compare | Clear, easy to understand |
| Solution 2 | Track index | When you need position too |
| Solution 3 | Recursion | Understanding recursive thinking |
| Solution 4 | reduce() | Functional style |
Output
9
300
-1
42
None