Вы сгенерировали несколько интересных ответов. Вот еще два.
Мой первый использует итератор, чтобы избежать
разрезание списка и является рекурсивным, потому что это кажется наиболее естественной формулировкой.
def list_split(orig, n):
if not n:
return orig
else:
li = iter(orig)
this = next(li)
result = [this]
for nxt in li:
result.extend([(this+nxt)/2, nxt])
this = nxt
return list_split(result, n-1)
for i in range(6):
print(i, list_split([0, 2], i))
Это печатает
0 [0, 2]
1 [0, 1.0, 2]
2 [0, 0.5, 1.0, 1.5, 2]
3 [0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2]
4 [0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.125, 1.25, 1.375, 1.5, 1.625, 1.75, 1.875, 2]
5 [0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0625, 1.125, 1.1875, 1.25, 1.3125, 1.375, 1.4375, 1.5, 1.5625, 1.625, 1.6875, 1.75, 1.8125, 1.875, 1.9375, 2]
Мое второе основано на наблюдении, что рекурсия не нужна, если вы всегда начинаете с двух элементов. Предположим, что эти элементы mn
и mx
. После применения N
операции разделения у вас будет 2^N+1
элементов, поэтому числовое расстояние между элементами будет (mx-mn)/(2**N)
.
Учитывая эту информацию, следовательно, должна быть возможность детерминистически вычислить элементы массива, или еще проще использовать numpy.linspace
следующим образом:
def grid(emin, emax, N):
return numpy.linspace(emin, emax, 2**N+1)
Похоже, что это дает те же ответы, и, вероятно, послужит вам лучше всего в долгосрочной перспективе.