как определить период функции [закрыто]

если у меня есть функция 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
13.12.2008 23:23:11
Это домашнее задание? Если это так, было бы хорошо, если бы вы признали это, и некоторые из них подтолкнули вас в правильном направлении.
Argalatyr 13.12.2008 23:32:50
да .. это мое домашнее задание, и я действительно застрял, и мой учитель сегодня ушел. поэтому я прихожу сюда, чтобы спросить о помощи ..
NONEenglisher 13.12.2008 23:36:51
Не проблема - просто предположить, что приятно быть ясным. Я рад, что вы получили то, что вам нужно.
Argalatyr 14.12.2008 04:22:44
1 ОТВЕТ
РЕШЕНИЕ

Используйте цикл for или цикл while с временным результатом и счетчиком. Последний способ наиболее эффективен (в общем).

Простая версия, в псевдокоде:

iterations = 0;
tmp = origin_matrix;

do
    tmp = operation(tmp);
    iterations += 1;
while tmp != origin_matrix;

return iterations;

РЕДАКТИРОВАТЬ: Вы также можете использовать простую конструкцию while:

while True:
    tmp = operation(tmp)
    iterations += 1

    if tmp == origin_matrix:
        break  # Or you could return here.

РЕДАКТИРОВАТЬ: Это было для функции B. Я не знал, что это были отдельные вопросы. Для этого примера операция (x) = функция A (x, 1).

Для функции A вы, скорее всего, использовали бы цикл for. псевдокод:

matrix = origin_matrix

for i in range(N_times):
    matrix = operation(matrix)

return matrix
6
14.12.2008 10:08:16
Обратите внимание, что это может быть не остановлено, если период операции бесконечен. Возможно, вы захотите встроить защиту, чтобы в этом случае цикл выполнялся максимальное количество раз. Это может зависеть от того, как язык обрабатывает целочисленное переполнение.
tvanfosson 13.12.2008 23:40:00
если operationмодифицирует tmpINPLACE то он всегда будет возвращать итерации == 1. В этом случае: tmp = copy.copy (оригинал) или copy.deepcopy (оригинал) могут быть полезны.
jfs 13.12.2008 23:52:25
# strager, спасибо за ваш ответ, но ваша операционная функция такая же, как и у моего functtionA (origin_matrix, N_times)? Точка, которую я не знаю, находится в функциональной функции, похоже, не имеет параметра N_times .... я довольно запутан, извините за мой глупый вопрос ..
NONEenglisher 14.12.2008 00:04:48
@NONEenglisher, функция операции в псевдокоде похожа на вашу функцию A с N_times = 1 (она поворачивается за один цикл).
strager 14.12.2008 00:20:08
@JF Себастьян, я разместил псевдокод, а не Python; Я не знаю, делает ли Python глубокие копии или нет с =. Я имел в виду глубокую копию, да (или, по крайней мере, неявно общую копию).
strager 14.12.2008 00:21:03