Question

I am required to write python code for the collatz conjecture using recursion in which the user is prompted for a positive integer and that number is either divided by 2 if even of multiplied by 3 and added to 1 if odd and this sequence continues until the value is equal to one. I must also prompt the user to choose how the sequence will be displayed, either the standard way in which it is calculated, reversed, or as a palindrome(forward and backward ie 86324895159842368) Below is currently what I have. I have no problem calculating the sequence itself, but I'm not sure how to implement the second argument. any time I attempt to define the direction as either F, B, or P, I get a bunch of errors. Any help in where I need to be going with this would be much appreciated

## CollatzRecursion


###
# define your RECURSIVE version of Collatz below this comment so that it runs
# correctly when called from below.

def Collatz(m):
    seq = [m]
    if m < 1:
       return []
    while m > 1:
       if m % 2 == 0:
         m = m / 2
       else:
         m = 3 * m + 1 
       seq.append(m)    
       if displaymode (F) :
         return seq
       if displaymode  (B) :
         seq = seq[::-1]
         return seq
       if displaymode (P) :


#
# REQUIREMENTS:
#  a) The correct sequence must be printed, all the values on one line.
#  b) Your Collatz function must use recursion.
#  c) Aside from two arguments accepting a positive integer value and the letter
#     F, B, or P; your Collatz function MAY NOT use any other internal variables.
#  d) Your Collatz function may accept only the two arguments described in (c).
#  e) If the second argument is 'F', the sequence should b printed in its
#       naturally generated order.
#     If the second argument is 'B', the sequence should be printed in reverse.
#     If the second argument is 'P', then a palindrome of the sequence values should 
#       be printed (see http://en.wikipedia.org/wiki/Palindrome).  In this case
#       it doesn't matter if your function prints the first value as 1 or the
#       value provided by the user.
###







###
# Do NOT alter Python code below this line
###
m = input( "Enter a positive integer value: " )
displaymode = ''  # initialize to anything not F, B, P
while displaymode not in ['F', 'B', 'P'] :
    displaymode = raw_input( "Choose a display mode:  F=forward, B=backward,         P=palindrome: " )

Collatz( m, displaymode )
print
Was it helpful?

Solution

First of all, your current approach is not recursive as solicited.

I personally would do something like this (complying with the need for recursion and the lack of additional variables):

def collatz(acc, mode):
    if isinstance(acc, int):
        acc = [acc]
    if acc[-1] == 1:
        if mode not in 'FBP':
            raise Exception('Unsupported display type')
        if mode == 'F':
            print ''.join(map(str, acc))
        elif mode == 'B':
            print ''.join(map(str, acc[::-1]))
        else:
            print ''.join(map(str, acc + acc[::-1]))
        return
    collatz(acc + [acc[-1] * 3 + 1 if acc[-1] % 2 else acc[-1] / 2], mode)

Sample usage:

>>> collatz(11, 'F')
1134175226134020105168421
>>> collatz(11, 'B')
1248165102040132652173411
>>> collatz(11, 'P')
11341752261340201051684211248165102040132652173411
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top