[Tutor] Function returns 'None'
Nick Raptis
airscorp at otenet.gr
Sun Jul 11 17:28:03 CEST 2010
On 07/11/2010 04:59 PM, Dominik Danter wrote:
> Hello
>
> As en exercise I wrote the following function:
>
>
> def recursfac(x,carryover=1):
> print 'x:',x,'carryover:', carryover
> if x > 1:
> carryover *= x
> recursfac(x-1, carryover)
> else:
> return carryover
>
> print recursfac(3)
>
> Very much to my surprise I get the following output:
>
> x: 3 carryover: 1
> x: 2 carryover: 3
> x: 1 carryover: 6
> None
>
> Where did I go wrong?
>
Your problem is that you expect the "return" to exit the recursion
altogether. Instead, carryover is passed to the previous level of the
recursion, which has nothing more to execute and returns None.
So the first step to fix this would be to make sure that your function
returns carryover no matter what:
def recursfac(x,carryover=1):
print 'x:',x,'carryover:', carryover
if x > 1:
carryover *= x
recursfac(x-1, carryover)
return carryover
else:
return carryover
Or simply (to remove the code duplication):
def recursfac(x,carryover=1):
print 'x:',x,'carryover:', carryover
if x > 1:
carryover *= x
recursfac(x-1, carryover)
return carryover
Now there's still one more problem. The output is this:
x: 3 carryover: 1
x: 2 carryover: 3
x: 1 carryover: 6
3
Why is it returning 3 istead of 6?
Well, the function didn't catch the returned carryover value on the way
up, so it's just returns what it knows: the value of carryover that it
self has computed.
Instead, you have to do this:
def recursfac(x,carryover=1):
print 'x:',x,'carryover:', carryover
if x > 1:
carryover *= x
carryover = recursfac(x-1, carryover)
return carryover
And this returns
x: 3 carryover: 1
x: 2 carryover: 3
x: 1 carryover: 6
6
Done!
What you should learn from this is that, when doing recursion, figuring
out what your function should do on the way up is as crucial as what you
want it to do on the way down.
Nick
More information about the Tutor
mailing list