python 2.7中使用递归和多个参数的collatz猜想



我需要使用递归为collatz猜想编写python代码,在递归中,用户会被提示输入一个正整数,如果是偶数,则该数字被除以2,如果是奇数,则该数被加1,并且该序列一直持续到值等于1。我还必须提示用户选择序列的显示方式,可以是计算、反转序列的标准方式,也可以是回文(向前和向后,即86324895519842368)。下面是我目前所拥有的。我计算序列本身没有问题,但我不确定如何实现第二个参数。每当我试图将方向定义为F、B或P时,我都会遇到一堆错误。非常感谢在我需要去的地方提供任何帮助

## 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

首先,您当前的方法不是按请求递归的。

我个人会做这样的事情(遵守递归的需要和缺少额外变量):

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)

示例用法:

>>> collatz(11, 'F')
1134175226134020105168421
>>> collatz(11, 'B')
1248165102040132652173411
>>> collatz(11, 'P')
11341752261340201051684211248165102040132652173411

最新更新