2009-11-08 7 views
2
fib(N)-> 
     P1 = spawn(fun concFib:conFib/0), 
     P2 = spawn(fun concFib:conFib/0), 
     X=rpc(P1,N-2),Y=rpc(P2,N-1),X+Y. 

conFib()-> 
     receive 
       {Client,N} -> Client ! regfib(N) 
     end. 

rpc(Pid,Request)-> 
     case erlang:is_process_alive(Pid) of 
       true -> begin 
             Pid ! {self(),Request}, 
             receive 
               {Pid,Respond} -> Respond 
             end 
           end; 
       false -> io:format("~w process is dead.",[Pid]) 
     end. 


regfib(N)-> 
     case N<2 of 
       true -> 1; 
       false -> regfib(N,1,1,1) 
     end. 

regfib(N,N,X,_)-> X ; 
regfib(N,M,X,Y)-> regfib(N,M+1,X+Y,X). 

L'idée est de diviser le processus de fib (N) en deux processus calcule une fib (N-2) et l'autre calc. fib (N-1) en même temps que fib (N) = fib (N-1) + fib (N-2). quand je cours le code précédent, rien ne se passe et le curseur s'arrête comme dans une boucle finie ou en attente d'un résultat qui n'atteint pas.
plzzz j'ai besoin d'aide je suis un nouveau programmeur Erlang, merci d'avance :)Pourquoi ce code erlang ne fonctionne-t-il pas?

+1

Vous ne savez pas quelle est votre intention avec ce code, mais notez que X et Y ne sont pas calculés en parallèle. – Zed

+0

Je veux calculer X et Y en parallèle, c'est mon intention. – Fuzzix

+0

Maintenant, votre flux d'appels est fondamentalement send-to-1, receive-from-1, send-to-2, recive-from-2, où receive fait votre bloc de code. Vous devriez changer ceci pour envoyer-à-1, envoyer-à-2, recevoir-de-1, recevoir-de-2. – Zed

Répondre

5

Dans votre conFib vous envoyez un entier, mais attendez un tuple en rpc. Devrait changer à:

conFib()-> 
     receive 
       {Client,N} -> Client ! {self(), regfib(N)} 
     end. 

Vous pouvez échapper à de telles situations en utilisant délai d'attente avec after dans votre reçoit.

+0

Merci Zed :), Il a résolu le problème, mais la logique du code ne fonctionne pas comme prévu :( X = rpc (P1, N-2) et X = rpc (P2, N-1) don Ne pas travailler en même temps le second attendre le premier Je veux calculer fib (N-1) et fib (N-2) en même temps chacun dans un processus distinct. plz ... – Fuzzix

5

Pour faire le calcul parallèle, vous pouvez faire quelque chose comme:

fib(N)-> 
     P1 = spawn(fun test:conFib/0), 
     P2 = spawn(fun test:conFib/0), 
     P1 ! {self(), N - 2}, 
     P2 ! {self(), N - 1}, 
     receive 
     {_, R1} -> R1 
     end, 
     receive 
     {_, R2} -> R2 
     end, 
     R1 + R2. 

L'important est que vous envoyez deux demandes avant d'attendre les réponses. La partie qui attend les réponses pourrait bien sûr être faite d'une manière plus belle.

+0

merci Rickard:) ... je l'ai eu .. pardonnez-moi votre réponse est plus spécifique à moi mettre le Q comme a répondu en premier Zed. – Fuzzix

Questions connexes