Reputation: 586
I'm having quite a hard time figuring out what's going wrong here:
class iterate():
def __init__(self):
self.length=1
def iterated(self, n):
if n==1:
return self.length
elif n%2==0:
self.length+=1
self.iterated(n/2)
elif n!=1:
self.length+=1
self.iterated(3*n+1)
For example,
x=iterate()
x.iterated(5)
outputs None
. It should output 6 because the length would look like this:
5 --> 16 --> 8 --> 4 --> 2 --> 1
After doing some debugging, I see that the self.length
is returned properly but something goes wrong in the recursion. I'm not really sure. Thanks for any help.
Upvotes: 1
Views: 7595
Reputation: 110069
In the two elif
blocks, you don't return a value after making the recursive call. You need a return
before the recursive calls to iterated
(e.g. return self.iterated(n/2)
). If you don't explicitly return
, the function will return None
.
That will fix this issue, but there is a way to make your code simpler: You don't actually need the member length
. Instead, you can add 1 to the result of the recursive call:
def iterated(n):
if n==1:
return 1
elif n%2==0:
return 1 + iterated(n/2)
else:
return 1 + iterated(3*n+1)
print(iterated(5))
This doesn't need to be in a class, since there is no need for any members.
Upvotes: 5
Reputation: 41958
You should finish each elif branch with return self.iterated(...)
rather than just self.iterated(...)
Upvotes: 2
Reputation: 6956
You are only returning a value from the deepest level of recursion, then ignoring it on the second-deepest level.
All of the self.iterated(...)
lines should read return self.iterated(...)
Upvotes: 2
Reputation: 54242
You're missing the return statements:
class iterate():
def init(self):
self.length=1
def iterated(self, n):
if n==1:
return self.length
elif n%2==0:
self.length+=1
**return** self.iterated(n/2)
elif n!=1:
self.length+=1
**return** self.iterated(3*n+1)
Upvotes: 3