reduce versus recursion? what am I missing...

Tim Hochberg tim.hochberg at ieee.org
Fri Apr 7 12:35:31 EDT 2000


> # I am trying to figure out why function d (recursive) and e (reduce)
> # DON'T do the SAME thing:
>
> def d(*tup):
>     "why doesn't this work?"
>     if len(tup)>1:
>         return d(tup[1:])+abs(tup[0]-tup[1])
>     else:
>         return 0

There are two problems here. First, you need to call apply(d, x) here
instead of d(x), on the second call, the function sees a singleton tuple
that looks like (tup[1:],) where tup is the original tuple.

Second, the recursive problem is not doing the same thing as the reduce: the
first element of the tuple passed down the chain needs to be made equal to
the difference. I believe the following does what you want, although it's a
little akward.

def d(*tup):
    if len(tup)>1:
        l = list(tup[1:])
        l[0] = abs(tup[0]-tup[1])
        return apply(d,l)
    else:
        return tup[0]

> l = (1,3,5,7,9)
>
> def e(*tup):
>     "it works"
>     return reduce(lambda x,y:abs(x-y),tup,0)
>
> print "--- test:"
> print "recursion: ",apply(d,l)
> print "reduce:    ",apply(e,l)
>
> #---
> #Warren
> #
> # output:
> #--- test:
> #recursion:  2     ( appears not to actually be recursing more than 1
> level!!!???)
> #reduce:     5
>
>
>





More information about the Python-list mailing list