我是编码初学者,所以请原谅我的琐碎代码错误。我试图用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)
答案 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]