2008-12-13 10 views
1

si j'ai une fonction A, qui peut appliquer une certaine règle sur une matrice donnée pour générer une autre matrice que je l'appelle l'état suivant de la matrice d'origine, aussi la fonction peut déterminer l'état final de la matrice par des temps donnés N (appliquer la règle sur l'origine et appliquer à nouveau la règle sur l'état suivant de la matrice d'origine, et appliquer la règle appliquer la règle ... pour N fois).comment déterminer la période d'une fonction

Supposons donc pour une matrice donnée, appliquer la règle pour 5 fois et la matrice finale deviennent les mêmes que la matrice d'origine, et nous appelons que la période de matrice est 5.

Et je avoir une autre fonction B, comment puis-je faire la fonctionB peut déterminer la période d'une fonction donnée sous la même règle de la fonctionA, et retourner la période? Je ne sais pas comment commencer à le faire ... Merci d'avance.

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 
+0

Est-ce que ce travail est fait? Si c'est le cas, il serait bon que vous reconnaissiez cela et certains ici vous pousseront dans la bonne direction. – Argalatyr

+0

yeah..its mes devoirs, et je suis vraiment coincé, et mon professeur est éteint aujourd'hui. Ainsi je viens ici pour demander des aides .. – NONEenglisher

+1

Pas un problème - suggérant juste que c'est agréable d'être clair. Je suis content que vous ayez ce dont vous aviez besoin. – Argalatyr

Répondre

6

Utilisez une boucle for, ou une boucle while avec un résultat temporaire et un compteur. Cette dernière méthode est la plus efficace (en général).

Version simple, en pseudocode:

iterations = 0; 
tmp = origin_matrix; 

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

return iterations; 

EDIT: Vous pouvez également utiliser une simple construction while:

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

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

EDIT: C'était pour functionB. Je ne savais pas qu'ils étaient des questions distinctes. Pour cet exemple, opération (x) = functionA (x, 1).

Pour la fonctionA, vous utiliseriez probablement une boucle for. Pseudocode:

matrix = origin_matrix 

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

return matrix 
+0

Notez que cela peut être non-stop si la période de l'opération est infinie. Vous pourriez vouloir construire un garde pour que la boucle exécute un nombre maximum de fois dans ce cas. Cela peut dépendre de la façon dont la langue gère le débordement d'entier. – tvanfosson

+0

bon point, merci :) – NONEenglisher

+0

si 'operation' modifie' tmp' inplace alors il retournera toujours les itérations == 1. Dans ce cas: tmp = copy.copy (original) ou copy.deepcopy (original) pourrait être utile. – jfs

Questions connexes