所以你想要一個公式!好 !讓我們去一些簡單的數學:
r首行的條目數是r*(r+1)/2
。因此row
是row*(row+1)/2 <= i
的最大整數。所以行是方程
row*(row+1)/2 = i
它重寫的正解的整數部分爲
row^2 + row - 2*i = 0
這是第二度方程,所以你可以使用平方根解決它。正解是(sqrt(1+8*i) - 1)/2
。
所以,你必須:在Python
row(i) = floor((sqrt(1+8*i) - 1)/2)
col(i) = i - row*(row+1)/2
演示:
def rc(i):
r = floor((-1 + sqrt(1+8*i))/2)
return (r, i-r*(r+1)/2)
測試:
print [rc(i) for i in range(20)]
[(0, 0), (1, 0), (1, 1), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2), (3, 3),
(4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4)]
有了正確的顯示
(0, 0),
(1, 0), (1, 1),
(2, 0), (2, 1), (2, 2),
(3, 0), (3, 1), (3, 2), (3, 3),
(4, 0), (4, 1), (4, 2), (4, 3), (4, 4),
...
注意:我開始所有我的指數爲0.如果您想堅持使用通常的編號,您必須將i,r和c加1。
爲什麼你想避免嵌套循環? – pkacprzak
@pkacprzak,因爲我想並行執行它,所以它會簡化事情,而且我很好奇 – Enrique
@Enrique看到我的答案。 –