Didn't understand the output of the following Python 3 code with reduce function?

Peter Otten __peter__ at web.de
Fri Aug 28 10:44:04 EDT 2020


Shivlal Sharma wrote:

> I have seen this code on one of competative programming site but I didn't
> get it, Why output is 9?
> 
> from functools import *
> 
> def ADDS(a,b):
>     return a+1
> nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
> add = reduce(ADDS, nums)
> print(add)
> 
> output: 9

Rewrite the ADDS() function like so

>>> def ADDS(a, b):
...     result = a + 1
...     print(f"ADDS({a}, {b}) --> {result}")
...     return result
... 

to see what's going on:

>>> reduce(ADDS, [1,2,3,4,5,6,7,8,9])
ADDS(1, 2) --> 2
ADDS(2, 3) --> 3
ADDS(3, 4) --> 4
ADDS(4, 5) --> 5
ADDS(5, 6) --> 6
ADDS(6, 7) --> 7
ADDS(7, 8) --> 8
ADDS(8, 9) --> 9
9

ADDS is called with the first two values, 
then with the first result (first value + 1) and the third value
then the second result ((first value + 1) + 1) and the fourth value...
This can be written recursively as 

ADDS(ADDS(ADDS(ADDS(ADDS(ADDS(ADDS(ADDS(1, 2), 3), 4), 5), 6), 7), 8), 9)

As the second argument is always discarded we get the first a=1 eight times 
incremented by one, i.e 9. 

To drive the point home that we always get
first item + (len(items) -1):


>>> reduce(ADDS, [42,"a","b","c","d"])
ADDS(42, a) --> 43
ADDS(43, b) --> 44
ADDS(44, c) --> 45
ADDS(45, d) --> 46
46







More information about the Python-list mailing list