recursion
Steve Holden
steve at holdenweb.com
Fri Sep 14 10:47:22 EDT 2007
Gigs_ wrote:
> Steve Holden wrote:
[...]
>>
>> regards
>> Steve
> >>> def factorial(n):
> print "n =", n
> if n==0:
> return 1
> else:
> return n * factorial(n-1)
>
> >>> factorial(3)
> n = 3
> n = 2
> n = 1
> n = 0
> 6
>
>
> now i understand. but one question at the end this function return 1. how python
> knows that it needs to multiply 1 with all recursive returns. (why python didnt
> sum recursive return with 1?)
>
>
> that will be all, thanks in advance
Aah, that's the magic of recursion (not that it's really magic at all).
When you call factorial(3), the function sees the value of n as 3. So
the if condition is false, so it must execute the return statement.
In order to do that it has to multiply n by the value of factorial n-1.
So it makes a call to a *new copy* of factorial, and this one has the
value 2 for n. The if statement again needs to execute the return
statement, and before it can do that it needs the value of factorial
n-1, so it makes a call to a *new copy* of factorial, and this one has
the value 1 for n. The if statement again needs to execute the return
statement, and before it can do that it needs the value of factorial
n-1, so it makes a call to a *new copy* of factorial, and this one has
the value 0 for n. [Are you detecting a pattern here?].
Finally *this* copy of factorial can immediately return the value of 1
to its caller, which then multiplies that by 1 and returns it ti *its
caller, which multiplies it by 2 and returns that to *its* caller, when
multiplies it by 3 and returns the result, 6.
In other words, the computer builds a "stack" of partially-completed
functions, and unwinds it when the innermost (topmost, whatever) finally
sees that it can return a result without creating another stacked call
to factorial.
Hope this straightens it out for you, it's a bit of a head-twister when
you first come across it.
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
Sorry, the dog ate my .sigline
More information about the Python-list
mailing list