Explain call stack of this function?

  • Thread starter Thread starter uestions
  • Start date Start date
  • Tags Tags
    Explain Function
Click For Summary

Discussion Overview

The discussion revolves around understanding the call stack of a recursive function in Python, specifically the function recursion0. Participants explore the behavior of the function as it executes with different values of x, focusing on the sequence of function calls and the timing of print statements.

Discussion Character

  • Exploratory
  • Technical explanation
  • Conceptual clarification
  • Debate/contested

Main Points Raised

  • One participant describes the flow of the function when x is set to 3, noting that the function calls itself until x equals 1, at which point it returns 1 and then prints the values of x as the stack unwinds.
  • Another participant suggests stepping through the program line by line to understand the recursion better, providing an example with x=4 to illustrate the call stack.
  • Several participants question why the print statement for x executes after the return from the recursive call, with one suggesting that the execution of the print statement is delayed until the function returns from deeper calls.
  • There is a discussion about the implicit return behavior of functions in Python, where a function that does not explicitly return a value will return None by default, and how this relates to the flow of execution.
  • One participant provides an analogy with a different function to clarify how control returns to the calling function after a function call completes, even if no value is returned.

Areas of Agreement / Disagreement

Participants generally agree on the mechanics of how recursion works and the flow of execution, but there are differing views on the implications of return values and the behavior of the print statements. The discussion remains unresolved regarding the exact nature of the return behavior in the context of the recursive function.

Contextual Notes

Some participants express uncertainty about the implications of the return value in the context of the recursive function, and there are mentions of potential exceptions that could alter the flow of execution, though these are not explored in detail.

uestions
Messages
22
Reaction score
0
I have the code (space = _):

def recursion0(x):
____if x == 1:
________return 1
____else:
________recursion0(x-1)
________print x

I know values 2-x will print, but I cannot figure out how to map the call stack. Below are my thoughts.

Let's set x = 3. 3 goes to 2 in recursion0(3-1), and then 2 goes to 1 in recursion0(2-1). Nothing is returned because there are no return statements, except for 1 which is the value given to recursion0(2). Then 2 is printed because x = 2. I still don't know what happens after this so 3 is printed. What happens after this so 3 is printed?
Another question, why does x print after 1 is returned (and not before)?
 
Last edited:
Technology news on Phys.org
Basically your code is calling the function again and again until the argument is 1 and then it returns.

You need to literally step thru your program line by line and when you hit the recursion0 function

Code:
rec(4) start with x=4 as an example
_x==1? no so we go to the else
_rec(4-1) so we call recursion0 with arg =3
__x==1? no so we go to the else
__rec(3-1) so now we call recursion0 with arg=2
___x=1? no so we go to the else
___rec(2-1) ...
___print 2
__print 3
...

does it make sense now?

One way to see this is to add a print stmt at the start of your function print: ">>> Entering recursion0 with x=", x

and a print stmt at the end of your function: print ">>> Exitting recursion0 with x=", x
 
Last edited:
uestions said:
I have the code (space = _):

You can make the spaces display properly by enclosing your code between [noparse]
Code:
 and
[/noparse] tags:

Code:
def recursion0(x):
    if x == 1:
        return 1
    else:
        recursion0(x-1)
        print x

Click the "Quote" button on this post to see exactly what I did.
 
  • Like
Likes   Reactions: 1 person
jedishrfu, what causes 3 to print when only 1 is returned to recursion0(2)? I am thinking since only a value is returned to recursion0(2), the function would stop there.
 
uestions said:
jedishrfu, what causes 3 to print when only 1 is returned to recursion0(2)? I am thinking since only a value is returned to recursion0(2), the function would stop there.

Each time the ELSE block is executed the recursion0 function is called again before it can reach the print statement so in a sense the print statement execution is put on hold until that function returns.

The value returned by your recusion0 function is not assigned to any variable and is not used anywhere in your program. Normally it would be as in the factorial recursion function shown below:

Code:
 def factor(x):
    if x==0
        return 1
    else:
        return x*factor(x-1)

and you can see the action by adding extra print statements as shown below:

Code:
def factor(x):
    print "Entering factor(", x, ")"
    if x==0: 
        rc=1
    else:
       rc=x*factor(x-1)

    print "Exitting factor(", x, ") returning value: ",rc
    return rc
 
So (for my code with x=4) does it flow like this:
recursion0(4)
x!= 1
else recursion0(3)
x != 1
else recursion0(2)
x!= 1
else recursion0(1)
x==1
return 1 to recursion0(2)
print 2
Return to recursion0(3)
print 3
Return to recursion0(4)
print 4
 
uestions said:
So (for my code with x=4) does it flow like this:
recursion0(4)
x!= 1
else recursion0(3)
x != 1
else recursion0(2)
x!= 1
else recursion0(1)
x==1
return 1 to recursion0(2)
print 2
Return to recursion0(3)
print 3
Return to recursion0(4)
print 4

Yes, does it make sense now? Recursion is a cool technique to learn, it develops very compact code which may use a little more computer resources than the equivalent for loop but is very elegant.

Don't forget to thank people via the thanks button...
 
  • Like
Likes   Reactions: 1 person
1 more question, what makes the program return to calls recursion0(3) and (4) when nothing explicitly says to return there?
 
When a function call is finished it automatically jumps back to where the function was called, even if the function doesn't return anything. Consider the following two lines:

arbitraryfunction(3)
print(3)

what could arbitraryfunction(3) possibly do to prevent print(3) from executing?
 
  • Like
Likes   Reactions: 1 person
  • #10
uestions said:
1 more question, what makes the program return to calls recursion0(3) and (4) when nothing explicitly says to return there?

Your code looks like python and by default it adds a return at the end of your function what it returns is undefined but is probably a zero.
 
  • Like
Likes   Reactions: 1 person
  • #11
Office_Shredder said:
When a function call is finished it automatically jumps back to where the function was called, even if the function doesn't return anything. Consider the following two lines:

arbitraryfunction(3)
print(3)

what could arbitraryfunction(3) possibly do to prevent print(3) from executing?

In rare cases, it could throw an exception which would bubble up until some block caught it.

http://www.tutorialspoint.com/python/python_exceptions.htm
 

Similar threads

  • · Replies 16 ·
Replies
16
Views
2K
  • · Replies 5 ·
Replies
5
Views
1K
  • · Replies 18 ·
Replies
18
Views
2K
  • · Replies 29 ·
Replies
29
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 4 ·
Replies
4
Views
1K
  • · Replies 8 ·
Replies
8
Views
2K
Replies
4
Views
2K
  • · Replies 11 ·
Replies
11
Views
1K
  • · Replies 4 ·
Replies
4
Views
3K