python – 具有可选输入函数的196算法

我想做什么:

>如果用户在调用函数时指定return_length = True,则应返回一个加上算法达到回文数所需的步数.例如,如果输入为5280且return_length = True,则您的函数应返回4(请注意,这是序列[5280,6105,11121,23232]中的条目总数).例如,输入为11时,该函数应返回1,因为它已经是一个回文数字.
>如果用户未指定return_length或指定return_length = False,则您的函数应返回算法终止的回文编号.例如,输入为5280时,算法应返回23232(整数,而不是字符串).同样,如果输入为89,则应返回整数8813200023188.

关于196算法的一些背景知识:

取两位数或更多的正整数,反转数字,并添加到原始数字.这是反向添加序列的操作.现在用所得的总和重复该过程,直到获得回文数.此过程可快速生成大多数整数的回文数.例如,从数字5280开始产生序列5280,6105,11121,23232.将算法应用于1,2,3 ……的最终结果是1,2,3,4,5,6,7 ,8,9,11,11,33,44,55,66,77,88,99,121,……(Sloane的A033865). 89的值特别大,为8813200023188.(自http://mathworld.wolfram.com/196-Algorithm.html起)

到目前为止我所拥有的:

def alg196(x, y = false):
   if y==False:
      while x == x[::-1]:
         x==x+x[::-1]
      return x
   else:
      seq = [x]
      while x == x[::-1]:
         x==x+x[::-1]
      seq.append(x)
   return seq

我收到错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_36.py", line 10, in <module>
    exec compile(u"print _support_.syseval(python, u'alg196(34)', __SAGE_TMP_DIR__)" + '\n', '', 'single')
  File "", line 1, in <module>

  File "/sagenb/sage_install/sage-5.3-sage.math.washington.edu-x86_64-Linux/devel/sagenb-git/sagenb/misc/support.py", line 487, in syseval
    return system.eval(cmd, sage_globals, locals = sage_globals)
  File "/sagenb/sage_install/sage-5.3-sage.math.washington.edu-x86_64-Linux/local/lib/python2.7/site-packages/sage/misc/python.py", line 56, in eval
    eval(z, globals)
  File "", line 1, in <module>

  File "", line 3, in alg196

TypeError: 'int' object has no attribute '__getitem__'

我不确定如何解决这个问题或错误.

获取一些有关答案的信息,我有这个新代码:

    def alg196(x, y = false):
if y==False:
    while str(x) == str(x)[::-1]:
       x=str(x)+str(x)[::-1]
    return x
else:
    seq = [x]
    while str(x) == str(x)[::-1]:
        x = str(x)+str(x)[::-1]
    seq.append(x)
return seq

但仍然没有得到回文数或回序数的回文数.

最佳答案 你无法获得整数的“切片”.首先,您需要将其转换为字符串. x [:: – 1]< – 如果x是整数,则此操作是非法的. 顺便说一句,这可以更好地编写为几个函数 – 执行计算的函数,以及在特定约束下运行函数的函数,并且接受return_length = True参数.

def reverse(n):
    return int(str(n)[::-1])

def is_palindrome(n):
    return str(n) == str(n)[::-1]

def alg196(n, return_length=False):
    results = [n]
    while not is_palindrome(results[-1]):
        results.append(n + reverse(n))
        n = results[-1]
    return results[-1] if not return_length else len(results)

编辑

根据Ashwini Chaudhary的代码稍加快一点的变化.上面的版本会生成一个结果列表,如果你想用中间数字做一些事情,这很好.但是,我认为以下功能是可读性和速度之间的最佳折衷.我不知道为什么他从count = 0开始.

def alg196(n, return_length=False):
    count = 1
    while not is_palindrome(n):
        n = n + reverse(n)
        count += 1
    return count if return_length else n
点赞