Python实现翻转数列:求前n项和及完整数列输出
本文介绍了一种名为翻转数列的Python实现方法,针对给定整数n和m,生成每隔m个符号翻转的数列并计算前n项和。通过两种思路解析规律,提供完整代码示例,帮助读者理解数列生成与求和逻辑,适用于算法练习与编程学习。
在刷题过程中遇到一道关于数列的题目,题目定义了一种称为翻转数列的数列类型。
给定两个整数n和m,其中n必须能被2m整除。对于从1开始的连续递增整数序列1, 2, 3, 4...,每隔m个数字进行一次符号翻转,初始符号为负号。
例如,当n = 8且m = 2时,生成的数列为:-1, -2, +3, +4, -5, -6, +7, +8。
又如,当n = 4且m = 1时,生成的数列为:-1, +2, -3, +4。
题目要求计算该数列前n项的总和。
如果仅需计算前n项和,存在一种简便思路,通过观察数列规律可以发现,例如当n = 8, m = 2时,数列为:-1, -2, +3, +4, -5, -6, +7, +8。
思路1如下:
观察一次符号翻转前后的两个子数组,例如-1, -2和+3, +4。计算对应位置数字之和,+3与-1的和为2,+4与-2的和也为2,这两个子数组的总和为4。同理,后续每对符号不同的子数组之和均为4。由于每组和为M*M(此处M=2,故为4),且共有N/2M组(此处8/4=2组),因此总和为M*N/2。
思路2如下:
观察相隔m个位置的数字对,其差值正好为M。这样的数字对共有N/2个,因此总和直接为M*N/2。
以下是Python实现代码,该代码不仅输出整个数列,还计算并输出前n项和,其中思路2的逻辑已在代码中体现。
def isInput(m,n):
c=n/m
d=c%2
if d==0:
return True
else:
return False
def s(m,n):
t=int(n/m)
an=[]
ai=0
for turntime in range(1,t+1):#turntime是翻转次数
for sublen in range(0,m):#sublen是相同符号的子序列长度
ai=ai+1
tt=turntime%2
if tt==0:
an.append(ai)
else:
ci=ai*(-1)
an.append(ci)
print(an)
print(sum(an))
test=[]
for a in an:
if a<0:
test.append(a)
x=len(test)
print(m*x)#这里可以直接计算出结果
m=int(input("请输入M:"))
n=int(input('请输入N:'))
if isInput(m,n)==False:
print('输入不合法')
else:
s(m,n)

补充知识:Python实现Fibonacci无穷数列,求第n项及前n项和。
Fibonacci数列(又称无穷列表)的前n项和序列为:1, 1, 2, 3, 5, 8, 13, 21, 34, 55…。
该数列可以递归地定义为:

这是一个递归关系,当n大于1时,数列的第n项等于前两项之和。利用递归算法可以简便地求解出第n项的值以及前n项的总和。
# 分段函数 F(n)= {1 n=0; 1 n=1; F(n-1)+F(-2) n>1}
def backValue(n):
if n<=1:
return 1
return backValue(n-1)+backValue(n-2)
n = int(input("输入一个大于 0 的正整数:"))
value = [i for i in range(n)]
Fbc_list = []
for i in value:
s = backValue(i)
Fbc_list.append(s)
print("第%s的数为:"%n,Fbc_list[-1],"\n无穷列表为:",Fbc_list,"\n前%s项和为:"%n,sum(Fbc_list))
以上关于翻转数列的Python实现案例,包括求前n项和及输出完整数列的功能,即为分享的全部内容,希望能提供参考,并欢迎大家支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













