если у меня есть функция A, которая может применить определенное правило к заданной матрице для создания другой матрицы, которую я называю ее следующим состоянием исходной матрицы, также функция может определить конечное состояние матрицы посредством заданное время N (применить правило о происхождении и снова применить правило в следующем состоянии матрицы начала и применить правило применения правила... для N раз).
Итак, предположим, что для данной матрицы применяйте правило к ней в 5 раз, а конечная матрица станет той же, что и матрица происхождения, и мы называем этот период матрицы 5.
И у меня есть другая функция B, как я могу заставить функцию B определить период данной функции под тем же правилом функции A и вернуть период? Я просто не знаю, как начать делать это.. Спасибо заранее.
def functionA(origin_matrix,N_times):
#apply rule on the origin_matrix to generate another matrix which is the next sate of it.
#apply rule on origin_matrix for N_times
return the_final_matrix
def functionB(origin_matrix):
#determine the period of the the origin_matrix.
return period
Используйте цикл for или цикл while с временным результатом и счетчиком. Последний метод наиболее эффективен (в общем).
Простая версия, в псевдокоде:
iterations = 0;
tmp = origin_matrix;
do
tmp = operation(tmp);
iterations += 1;
while tmp != origin_matrix;
return iterations;
EDIT: вы также можете использовать простую конструкцию:
while True:
tmp = operation(tmp)
iterations += 1
if tmp == origin_matrix:
break # Or you could return here.
EDIT: Это было для функции B. Я не знал, что это отдельные вопросы. Для этого примера операция (x) = functionA (x, 1).
Для функции A вы, скорее всего, будете использовать цикл for. Псевдокод:
matrix = origin_matrix
for i in range(N_times):
matrix = operation(matrix)
return matrix
operation
изменяет tmp
она всегда будет возвращать итерации == 1. В этом случае: tmp = copy.copy (оригинал) или copy.deepcopy (оригинал) могут быть полезны.