Python:对digitum序列的重新识别

时间:2018-04-02 00:21:33

标签: python sequence

我是编码初学者,所以请原谅我的琐碎代码错误。我试图用Python编写一个程序来获取序列A004207。 "所有先前术语的数字总和"。

 a_n = 1, 1, 2, 4, 8, 16, 23, 28, 38, 49, ... (with a_0=1)

这是Euler problem #551的一部分。 但是,我还远未解决这个问题,我一直专注于正确地获取蛮力的复原代码,现在我已经陷入困境。

以下是我迄今为止的努力,但它不起作用。 SumOfDigits函数没问题,但DigitSum(n)很乱。

有人有什么想法吗?

  

给定数字x的数字总和

def SumOfDigits(x):
  sum = 0
  while (x != 0):
      sum = sum + x % 10
      x = x // 10

  return sum
  

序列中所有数字的总和,直到n

def DigitSum(n):

  i = 1
  step = 1        # Step in sequence
  result = 1      # initialize result
  number = 10     # Endterm in sequence

  step = min(step, n-i)
  for j in range(0,step):
      if j < step:
          j = j + 1
          i = i + 1

  result = result + SumOfDigits(result)

  if i > n:
      return result

print(DigitSum(number),"Sum is =",result)

2 个答案:

答案 0 :(得分:3)

请注意

  

a(n)= a(n-1)+ SumOfDigits(a(n-1))

因为a(n-1)是a(n-1)之前的所有项的数字和之和。所以我们可以写

 def DigitSum(n):
      a = 1
      for i in range(n):
           a = a + SumOfDigits(a)
      return a

测试一下,

>>> [a(i) for i in range(10)]
[1, 2, 4, 8, 16, 23, 28, 38, 49, 62]

根据您想要的索引进行调整。

答案 1 :(得分:0)

具有列表推导的递归(但非常低效)版本。

def SumOfDigits(x):
    sumx = 0
    while (x != 0):
        sumx = sumx + x % 10
        x   = x // 10
    return sumx

def DigitSum(n):
    if n == 0:
        return 1
    else:
        return sum([SumOfDigits(DigitSum(i)) for i in range(0,n)])

test_set = (1, 1, 2, 4, 8, 16, 23, 28, 38, 49, 62, 70, 77, 91, 101)
result_set = [DigitSum(i) for i in range(0,len(test_set))]
print(result_set)

# [1, 1, 2, 4, 8, 16, 23, 28, 38, 49, 62, 70, 77, 91, 101]