从1开始的正整数排列成行。第i行有i个数字。例如前四行:
1 | 2, 3 | 4, 5, 6 |7, 8, 9, 10
编写一个函数,该函数接受参数";L";并且返回该布置的第L行。
这是我的方法:
def find_line(l):
array = []
x = 1
for i in range(1, l + 1):
while len(array) != I:
array.append(x)
x += 1
if i == l:
return array
else:
array = []
您不需要循环。你可以直接计算出组中的第一个数字,方法是用取级数的和
start = 1 + (n * (n + 1)) // 2
如果你想让n从1
而不是0
开始,你需要从n中减去
def group(n):
n -= 1
start = 1 + (n * (n + 1)) // 2
return list(range(start, start + n +1))
# try it on first 10 numbers:
for i in range(1, 10):
print(group(i))
这将打印:
[1]
[2, 3]
[4, 5, 6]
[7, 8, 9, 10]
[11, 12, 13, 14, 15]
[16, 17, 18, 19, 20, 21]
[22, 23, 24, 25, 26, 27, 28]
[29, 30, 31, 32, 33, 34, 35, 36]
[37, 38, 39, 40, 41, 42, 43, 44, 45]
如果需要字符串,可以使用join
或类似的方法。
好吧,我想展示它背后的数学。让我们计算一个行号n的最后一项的表达式。
1 | 2 | 3 | 4 | .....line numbers
--+------+---------+------------+------
1 | 2, 3 | 4, 5, 6 | 7, 8, 9, 10| .....values
对于n=1(即行号1(,last=1所以last(1(=1
现在假设last(n)
表示第n行的最后一个值,那么:-last(n) = last(n-1) + n
例如,对于第4行,n=4,我们有last(4) = last(3) + 4 = 6 + 4
因此,展开复发,我们有:-
last(n) = last(n-1) + n
= (last(n-2) + n-1) + n
= last(1) + 2 + 3 + ....+ n-1 + n
= 1 + 2 + 3 + ....+ n-1 + n
= n*(n+1)/2
Thus,
last(n) = n*(n+1)/2
由于第n行中有n个值,因此我们可以将第n行的起始值设置为:-
start(n) = last(n) - n + 1
OR
start(n) = n*(n-1)/2 + 1
或者,您也可以将start(n(设置为:-
start(n) = start(n-1) + n-1
= start(n-2) + n-2 + n-1
= start(1) + 1 + 2 + 3 + ....+ n-2 + n-1
= 1 + (1 + 2 + 3 + ... + n-2 + n-1)
= 1 + (n-1)*n/2
start(n) = n*(n-1)/2 + 1
休息你可以运行一个循环
loop from i=0 to i=n-1 :
print( start(n) + i )
def find_line(l):
starting_num = 1
res = []
for count in range (l):
starting_num += count
res = list(range(starting_num, starting_num+l))
return res
测试l=5:的功能
print(find_line(5))
[11, 12, 13, 14, 15]