Webtron - 3 months ago 11
Python Question

# Variable Scope Issue in Python

I am new to Python and I have been working with it for a bit, but I am stuck on a problem. Here is my code:

``````def collatz(num,ctr):
if(num != 1):
ctr+=1
if(num%2==0):
collatz(num/2,ctr)
else:
collatz(num*3+1,ctr)
return ctr
test=collatz(9,0)
``````

For any number I put in for
`num`
, let's say
`9`
for instance, and
`0`
for
`ctr`
,
`ctr`
always comes out as
`1`
. Am I using the
`ctr`
variable wrong?

EDIT:
I am trying to print out how many times the function is recursed. So
`ctr`
would be a counter for each recursion.

The variable `ctr` in your example will always be `1` because of the order of the recursive call stack. As one value of `ctr` is returned, then the call stack will start returning the previous values of `ctr`. Basically, at the very last recursive call, the highest value of `ctr` will be returned. But since the method call at the bottom of the call stack returns the very last value aka the value that will be stored in `test`, `test` will always be `1`. Let's say I input parameters into `collatz` that would result in five total calls of the method. The call stack would look like this coming down,

``````collatz returns ctr --> 5
collatz returns ctr --> 4
collatz returns ctr --> 3
collatz returns ctr --> 2
collatz returns ctr --> 1 //what matters because ctr is being returned with every method call
``````

As you can see, no matter how many times `collatz` is called, `1` will always be returned because the call at the bottom of the call stack has `ctr` equaling `1`.

The solution can be a lot of things, but it really depends on the purpose of what you're trying to accomplish which isn't clearly stated in your question.

EDIT: If you want `ctr` to end up being the number of times a recursive call is made, then just assign `ctr` to the value of the method call. It should look like this,

``````def collatz(num,ctr):
if(num != 1):
ctr+=1
if(num%2==0):
ctr = collatz(num/2,ctr)
else:
ttr = collatz(num*3+1,ctr)
return ctr
test=collatz(9,0)
``````
Source (Stackoverflow)